有人能告訴我這是什麼代碼之間的區別:遍歷列表的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教程中提到的,但我不太明白。
有人能告訴我這是什麼代碼之間的區別:遍歷列表的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教程中提到的,但我不太明白。
在第一個版本中,您創建一個副本(通過從頭到尾切分列表),在第二個版本中迭代原始列表。
如果迭代容器,其大小在迭代過程中不能更改,原因很充分(請參見下文)。但是,由於您致電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
)。
爲什麼你需要一個循環?只要'x.insert(0,5)'就可以用於這個例子 –
這不是重點,我試圖理解Okey的機制 –