-1

当使用单个参数测试Python参数列表时,我发现一些奇怪的行为与print带单参数的Python参数列表

>>> def hi(*x): 
...  print(x) 
... 
>>> hi() 
() 
>>> hi(1,2) 
(1, 2) 
>>> hi(1) 
(1,) 

可以在任何一个给我解释一下最后一个逗号在hi(1)的结果的含义(即(1,)

+2

这意味着打印的值是一个元组中包含一个元素的元组。 – Rockybilly

回答

1

其实行为只是有点‘怪异’。 :-)

您的参数x前缀为星号,这意味着您传递给该函数的所有参数将被“卷起”为一个元组,并且x将为该元组。

(1,)是Python的写入一个值的元组的方式,用(1)对比它,这将是数字1。

下面是一个更一般的情况:

def f(x, *y): 
    return "x is {} and y is {}".format(x, y) 

这里一些运行:

>>> f(1) 
'x is 1 and y is()' 
>>> f(1, 2) 
'x is 1 and y is (2,)' 
>>> f(1, 2, 3) 
'x is 1 and y is (2, 3)' 
>>> f(1, 2, 3, 4) 
'x is 1 and y is (2, 3, 4)' 

通知的第一个参数是如何去x和所有以后的参数被打包入T他元组y。你可能只是发现了Python代表0或1个元素的元组有点奇怪,但是当你意识到(1)必须是一个数字时才有意义,所以必须有某种方法来表示单元元组。 Python只使用尾随逗号作为约定,就这些。

+0

我接受了你的答案,因为'单元元组打印约定'的解释。如果你能解释为什么'(1)'被解释为数字'1',那将是非常值得的。 – transang

+1

当然,通常括号不会改变表达式的含义。例如,你可以说'4+(1)',它会是5,就像'4 *(2-1)'会是4一样。因为约定是用括号来表示子表达式的分组,所以Python的设计者认为将意义超载为意味着分组和单元元组将会太混乱。另外Python有一个'type'函数。实际上'type((2))'是'int','type((2,))'是'tuple'。我们不希望存在任何含糊不清的情况,如果把'(2)'当作元组来处理的话就不会有歧义。 –

+0

非常感谢您的详细解答。我刚刚创建[新答案](http://stackoverflow.com/questions/40710455/why-single-element-tuple-is-interpreted-as-that-element-in-python)。让我在这里链接你的评论的答案 – transang