2016-02-04 151 views
1

有人能告訴我這是什麼代碼之間的區別:遍歷列表的Python

x = [1, 2, 3, 4, 5, 6, 7] 
for i in x[:]: 
    if i == 5: 
     x.insert(0, i) 

這個代碼和:

x = [1, 2, 3, 4, 5, 6, 7] 
for i in x: 
    if i == 5: 
     x.insert(0, i) 

爲什麼第二個將無法工作?我知道它是在Python教程中提到的,但我不太明白。

+1

爲什麼你需要一個循環?只要'x.insert(0,5)'就可以用於這個例子 –

+0

這不是重點,我試圖理解Okey的機制 –

回答

6

在第一個版本中,您創建一個副本(通過從頭到尾切分列表),在第二個版本中迭代原始列表。

如果迭代容器,其大小在迭代過程中不能更改,原因很充分(請參見下文)。但是,由於您致電x.insert,列表的大小會發生變化。


如果執行的第二個版本,它實際上不會立即拋出一個錯誤,但將無限期持續,填補了清單了越來越多的5S:

一旦你在列表索引4(和i因此5),你在列表的開頭插入5:

[5, 1, 2, 3, 4, 5, 6, 7] 

然後繼續循環,隱含增加你的指數爲5,也就是現在的5再次,因爲由於您的插入,整個列表都被轉移到右側離子,所以5將被再次插入:

[5, 5, 1, 2, 3, 4, 5, 6, 7] 

這正好「永遠」(直到有一個MemoryError)。

+0

,但是如果我在最後添加「print(x)」,它會顯示修改後的x(其中x [0]爲5),因此這將表明x的大小確實發生了變化 –

+0

另外OP應該注意,這兩種方法在Python 3.x中都不起作用 – kmario23

+0

@ kmario23兩者均可在Python 3完全像在Python 2中一樣。 – L3viathan