2013-10-07 32 views
0

我有一个问题,理解从python中使用星号运算符从列表中解析参数的过程。python参数拆包令人费解的行为

我跟着documentation entry,并试图重新创建我自己的小例子。

所以我定义数字的简单列表:

list = [1, 2, 3] 

,并做了一个快速检查,这个工程:

print(1, 2, 3) 
(1, 2, 3) 

,这(只是抬头):

print([1, 2, 3]) 
[1, 2, 3] 

另一方面,此位失败

print(*[1, 2, 3]) 
    File "<stdin>", line 1 
    print(*[1, 2, 3]) 
     ^
SyntaxError: invalid syntax 

而且这也失败:

print(*list) 
    File "<stdin>", line 1 
    print(*list) 
     ^
SyntaxError: invalid syntax 

我的文档中确信一切正常:

list = [1, 2] 
range(*list) 
[1] 

它做到了。

我想了解从列表中解压缩参数的确切工作原理以及期望从中得到的结果,因为它看起来并不像我想象的那么直截了当。

+1

你使用Python 2.7?在这种情况下,'print'语句不是一个函数,所以星形运算符将不会像您所期望的那样工作。 – Kevin

+0

适用于python3.2! 你想回答,所以我会接受你的答案? –

回答

3

开箱只有当你是一个函数调用内部的工作原理:

>>> def foo(a,b,c): 
...  pass 
... 
>>> foo(*[1,2,3]) 
>>> 

使用它在其他地方会导致错误:

>>> (*[1,2,3]) 
    File "<stdin>", line 1 
    (*[1,2,3]) 
    ^
SyntaxError: invalid syntax 

在Python 2.7,print不是函数,它是一个声明。至于翻译而言,这样的:

print(*[1,2,3]) 

在语法上是相同的:

print *[1,2,3] 

这是无效的。在Python 3.X中,print现在是一个函数,因此解包将起作用。

>>> print(*[1,2,3]) 
1 2 3 

您可以端口功能print回2.7来自未来进口:

>>> from __future__ import print_function 
>>> print(*[1,2,3]) 
1 2 3 
+0

我认为'print * [1,2,3]'是无效的 –

+1

@FooBarUser,我同意。这就是为什么我写了“...哪个是无效的” – Kevin

+0

对不起误解 –

0

变化:print(\*[1, 2, 3])到:print(*[1, 2, 3])

>>> print(*[1,2,3]) 
1 2 3 

>>> print(\*[1,2,3]) 
    File "<stdin>", line 1 
    print(\*[1,2,3]) 
       ^
SyntaxError: unexpected character after line continuation character 

它不会对python2印刷,因为它不是一个功能工作。它将为蟒蛇3.例如工作:

>>> def x(a,b,c): 
...  print(a,b,c) 

>>> x(*[1,2,3]) 
(1, 2, 3) 
+0

对不起,这是我的文章中的一个错字,我会立即修复它 –

+0

它的工作原理没有\ –

+0

不适用于我...我在这里添加它是因为在网站上发生的格式:) –