在迭代期間修改列表
在循環遍歷列表時修改列表時,提供的程式碼片段會出現意外行為:
l = range(100) for i in l: print i, print l.pop(0), print l.pop(0)
這段程式碼的輸出與人們可能期望的不同,因為修改清單的行為(透過彈出elements) 影響迭代器。當為列表建立迭代器時,它會追蹤列表中的當前位置。當元素從清單中刪除時,迭代器的位置也會隨之調整。但是,如果在迭代過程中修改列表,則迭代器的位置將變得無效,並且可能會發生不可預測的結果。
在這種特定情況下,循環旨在循環遍歷列表 l 中的元素。但是,當從清單中彈出一個元素時,迭代器的位置會發生移動,導致它跳過清單中的下一個元素。因此,循環僅迭代原始列表元素的一半。
為了避免這種行為,重要的是永遠不要修改正在迭代的容器。相反,人們應該創建容器的副本並對其進行迭代。這可以透過在開始循環之前複製列表來實現:
l_copy = l[:] for i in l_copy: print i, print l.pop(0), print l.pop(0)
或者,可以使用while 循環而不是for 循環,它為列表中的當前位置維護一個單獨的索引:
i = 0 while i < len(l): print i, print l.pop(0), print l.pop(0) i += 1
以上是為什麼在迭代期間修改列表會導致意外結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!