2016-01-09 198 views
22

下面是一段代碼,它給出了輸出:0 1 2 2。因爲a[-1]訪問列表中的數字3,所以我期待輸出3 3 3 3。網上給出的解釋是「每次迭代中a[-1]變化的值」,但我不太明白如何或爲什麼。任何解釋都會很棒!for循環並遍歷列表

a = [0, 1, 2, 3] 
for a[-1] in a: 
    print(a[-1]) 
+1

我從來沒有見過這樣的事情;我很想閱讀文章/教程/無論它是什麼顯示這個例子,你可以張貼鏈接到它嗎? – GingerPlusPlus

+3

另外,恭喜你的第一個問題! (對新SO用戶的信心得以恢復) – GingerPlusPlus

+3

不錯的問題。爲什麼'a [-1]'甚至被允許作爲循環變量... – timgeb

回答

15

這裏發生了什麼是一個列表在循環過程中發生了變化。

讓我們看看下面的代碼片段:

a = [0, 1, 2, 3] 
for a[-1] in a: 
    print a 

輸出是:

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

每次迭代:

  • 讀取位置值目前被內部指針指向
  • 立即指派它最後的元素在該最後一個元素之後列表
  • 被打印在標準輸出

因此,它是這樣:

  • 內部指針指向第一元件,它是0,並且最後一個元素改寫該值;列表是[0, 1, 2, 0];打印值爲0
  • 內部指針指向第二個元素,它是1,最後一個元素被該值覆蓋;列表是[0, 1, 2, 1];打印值爲1
  • (...)
  • 最後一步,內部指針指向最後一個元素;最後一個元素被自己覆蓋 - 列表在最後一次迭代時不會改變;打印元素也不會改變。
34

雖然做for a[-1] in a,你實際上是通過列表和臨時存儲當前元素的值迭代爲a[-1]

你可以看到像這些指令的循環:

a[-1] = a[0] # a = [0, 1, 2, 0] 
print(a[-1]) # 0 
a[-1] = a[1] # a = [0, 1, 2, 1] 
print(a[-1]) # 1 
a[-1] = a[2] # a = [0, 1, 2, 2] 
print(a[-1]) # 2 
a[-1] = a[3] # a = [0, 1, 2, 2] 
print(a[-1]) # 2 

所以,當你是第三個要素,然後2存儲到a[-1](其值是1,但03上啓動)。

最後,當涉及到最後一個元素(以及迭代結束)時,存儲在a[-1]中的最後一個值是2,這解釋了爲什麼要打印兩次。