当使用单个参数测试Python参数列表时,我发现一些奇怪的行为与print
。带单参数的Python参数列表
>>> def hi(*x):
... print(x)
...
>>> hi()
()
>>> hi(1,2)
(1, 2)
>>> hi(1)
(1,)
可以在任何一个给我解释一下最后一个逗号在hi(1)
的结果的含义(即(1,)
)
当使用单个参数测试Python参数列表时,我发现一些奇怪的行为与print
。带单参数的Python参数列表
>>> def hi(*x):
... print(x)
...
>>> hi()
()
>>> hi(1,2)
(1, 2)
>>> hi(1)
(1,)
可以在任何一个给我解释一下最后一个逗号在hi(1)
的结果的含义(即(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只使用尾随逗号作为约定,就这些。
我接受了你的答案,因为'单元元组打印约定'的解释。如果你能解释为什么'(1)'被解释为数字'1',那将是非常值得的。 – transang
当然,通常括号不会改变表达式的含义。例如,你可以说'4+(1)',它会是5,就像'4 *(2-1)'会是4一样。因为约定是用括号来表示子表达式的分组,所以Python的设计者认为将意义超载为意味着分组和单元元组将会太混乱。另外Python有一个'type'函数。实际上'type((2))'是'int','type((2,))'是'tuple'。我们不希望存在任何含糊不清的情况,如果把'(2)'当作元组来处理的话就不会有歧义。 –
非常感谢您的详细解答。我刚刚创建[新答案](http://stackoverflow.com/questions/40710455/why-single-element-tuple-is-interpreted-as-that-element-in-python)。让我在这里链接你的评论的答案 – transang
这意味着打印的值是一个元组中包含一个元素的元组。 – Rockybilly