繁体   English   中英

“ foo(* a)”在Python中如何工作?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM