2015-11-03 52 views
5

我可以用Python這種奇怪的行爲掙扎(2,3):奇怪的直列分配

>>> a = [1, 2] 
>>> a[a.index(1)], a[a.index(2)] = 2, 1 

這導致:

>>> a 
[1, 2] 

但是,如果你寫

>>> a = [1, 2] 
>>> a[a.index(1)], a[a.index(2)] = x, y 

其中x, y != 2, 1(可以是1, 1,2, 2,3, 5等),這導致:

>>> a == [x, y] 
True 

正如人們所期望的那樣。爲什麼a[a.index(1)], a[a.index(2)] = 2, 1產生結果a == [2, 1]

>>> a == [2, 1] 
False 
+1

你問了一個奇怪的問題。爲什麼'a [a.index(1)],[a.index(2)] = 2,1'什麼都打印? :) – Alik

+0

我的意思是當請求的價值。我在濫用記譜法。 XD – Dargor

+0

相關(和迂迴):http://stackoverflow.com/q/32127908/3001761 – jonrsharpe

回答

10

,因爲它實際上被這樣解釋:

>>> a = [1, 2] 
>>> a 
[1, 2] 
>>> a[a.index(1)] = 2 
>>> a 
[2, 2] 
>>> a[a.index(2)] = 1 
>>> a 
[1, 2] 

引述,每standard rules for assignment(重點煤礦):

  • 如果目標列表是一個逗號分隔目標列表:該對象必須是具有與目標列表中的目標 相同數量的項目的迭代,並且分配項目,從左至右依次爲,至 的對應目標。

分配到a[a.index(1)](即a[0])發生之前所述第二分配請求a.index(2),通過該時間a.index(2) == 0

您將看到任何分配相同的行爲:

foo = [a, b] 
foo[foo.index(a)], foo[foo.index(b)] = x, y 

其中x == b(在這種情況下,任何任務分配時,在右邊的第一個值是2)。

+1

你能從文檔中引用Python中的賦值順序嗎? – Dargor

+0

預先感謝您! – Dargor

+0

Upvoted並接受。感謝你傑出的工作! – Dargor