2011-10-12 46 views
11

考慮以下Python3程序:Python的賦值運算符關聯

a = [0, 0] 
i = 0 
a[i] = i = 1 
print(a, i) 

a = [0, 0] 
i = 0 
i = a[i] = 1 
print(a, i) 

我預期的輸出是:

[0, 1] 1 
[1, 0] 1 

而是我的了:

[1, 0] 1 
[0, 1] 1 

我的問題是: Python語言規範中有關於賦值運算符關聯性的任何內容,或者是a的行爲bove示例未定義?

我能夠發現的所有表達式都是從左到右進行評估,除了在賦值的情況下首先評估r值,但這沒有幫助。

+1

有趣的是,你的例子是在[該部分的端部(http://docs.python.org/release/非常相似的示例3.0.1 /參考/ simple_stmts.html#賦值語句)。 –

回答

12

簡短回答:代碼是明確的;該訂單是從左到右。

龍答:

首先,讓我們的術語的權利。與其他一些語言不同,Python中的賦值語句是語句,而不是運算符。這意味着您不能使用賦值作爲另一個表達式的一部分:例如i = (j = 0)不是有效的Python代碼。

賦值語句被定義爲明確允許多個賦值目標(在你的例子中,這些是ia[i])。每個目標都可以是一個列表,但讓我們把它放在一邊。

如果存在多個分配目標,則會從左向右分配值。引述documentation

賦值語句計算表達式列表(記住 這可以是單個表達式或逗號分隔的列表,後者 導出一個元組)和單一的所得對象分配給每個 的目標列表,從左至右

7

只是要說清楚,因爲我努力去理解這一點。語句:

a = b = c = ... = E 

相當於

a = E 
b = E 
c = E 
...