[英]How does “foo(*a)” work in Python?
刚从C ++切换到Python,发现有时很难理解Python背后的想法。
我想,变量是对实际对象的引用。 例如,a =(1,2,5)表示a->(1,2,5),因此,如果b = a,则b和a是2个引用,指向相同的(1,2,5)。 它有点像C / C ++中的指针。
如果我有:
def foo(a,b,c):
print a,b,c
a=(1,3,5)
foo(*a)
*
在这里是什么意思?
看起来它将元组a扩展为a [0],a [1]和a [2]。 但是,为什么在print(a[0],a[1],a[2])
工作正常的情况下print(a[0],a[1],a[2])
print(*a)
无法工作?
您似乎已经了解星号是用于参数解包的 。 因此,唯一的困惑是关于print
语句本身。
在python 3中, print(*a)
可以正常工作:
>>> a=(1,3,5)
>>> print(*a)
1 3 5
但是,在Python 2中,它不会:
>>> a=(1,3,5)
>>> print(*a)
File "<stdin>", line 1
print(*a)
^
SyntaxError: invalid syntax
这是因为print
在Python 2中不是函数,因此Python 2不会将星号解释为参数解包指令。 实际上,在Python 2中print
不需要括号。 用括号括起来的值没有任何意义。 (a)
和a
相同。 (而(a,)
是具有一个成员的元组。)因此print (a)
和print a
也相同。
但是,您可以在以后使用print
函数覆盖print
语句:
>>> from __future__ import print_function
>>> print(*a)
1 3 5
它在Python 2中不起作用,因为那里print
不是一个函数 。 这是一个声明。
但是,在Python 3中,它将正常运行,因为print
是一个函数 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.