2013-10-07 66 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

不適用於我...我在這裏添加它是因爲在網站上發生的格式:) –