刚从C ++切换到Python,发现有时候理解Python背后的想法有点难。
我猜,变量是对真实对象的引用。例如,a =(1,2,5)表示a - > (1,2,5),所以如果b = a,则b和a是指向相同(1,2,5)的2个引用。它有点像C / C ++中的指针。
如果我有:
def foo(a,b,c):
print a,b,c
a=(1,3,5)
foo(*a)
*
在这里意味着什么?
看起来它将元组a扩展为[0],[1]和[2]。但为什么print(*a)
在print(a[0],a[1],a[2])
工作正常时无法正常工作?
答案 0 :(得分:3)
您似乎已经明白星号适用于argument unpacking。所以唯一的混淆是关于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
函数from the future覆盖print
语句:
>>> from __future__ import print_function
>>> print(*a)
1 3 5
答案 1 :(得分:2)
它在Python 2中不起作用,因为print
不是函数。这是一个声明。
但是,在Python 3中,它将按预期工作,因为print
是函数。