2014-03-25 121 views
2

今天剛剛開始學習Python。我喜歡它,文檔和人們所說的一樣有幫助。但是很明顯,我沒有看到Python的兩個特性:那些列表和那些for-loops。Python for循環刪除中途停止

這段代碼的結果是:

lets = ['a','b','c','d','e','f','g','h','i','j'] 

for j in lets: 
    del lets[0] 
    print(lets) 

是這樣的:

['b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'] 
['c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'] 
['d', 'e', 'f', 'g', 'h', 'i', 'j'] 
['e', 'f', 'g', 'h', 'i', 'j'] 
['f', 'g', 'h', 'i', 'j'] 

爲什麼它停止在五個步驟,而不是十(並因此刪除所有項目)?

+0

那麼你正在遍歷一個你正在刪除的列表,當你迭代它。似乎也許你不想這樣做。 – Claris

回答

2

完成從我可以告訴你有lets十個元素。你的循環停在五點。刪除五個元素後,剩下五個元素。第五次循環後,它會檢查lets中有多少個元素,看到五個元素,並且已經循環五次,因此停止。

+0

好的,那麼同樣格式不正確的循環可能會導致兩人在確切的中間以外的地方會面,我想我明白了。 – Lenoxus

4

在迭代它時正在修改集合。這是一個巨大的紅旗 - 從不這樣做。

如果你想解決您上面的代碼,遍歷一個複製lets的:

for j in lets[:]: 
    del lets[0] 

或者一些其他的對象,它是相同的長度爲lets,像range(len(lets))

我將指出的是,上述被更簡單地用lets.clear()

+0

lets.clear()是有意義的。這只是簡化的簡化;最初的目標與刪除列表中的所有內容無關。 (當我只想刪除單個項目但將指令放到外觀中時,我實際上偶然碰到了它,然後我想:「等一下,我不希望這種行爲......) – Lenoxus