怎么" foo(* a)"在Python工作?

时间:2014-08-23 04:17:52

标签: python function arguments

刚从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])工作正常时无法正常工作?

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函数