1. 程式人生 > >Python 可變物件和迭代器 注意點

Python 可變物件和迭代器 注意點

記住,在迭代可變物件的時候修改它們並不是個好主意. 這在迭代器出現之前就是一個問題.
一個流行的例子就是迴圈列表的時候刪除滿足(或不滿足)特定條件的項:
for eachURL in allURLs:
    if not eachURL.startswith('http://'):
    allURLs.remove(eachURL) # YIKES!!


除列表外的其他序列都是不可變的, 所以危險就發生在這裡. 一個序列的迭代器只是記錄你
當前到達第多少個元素, 所以如果你在迭代時改變了元素, 更新會立即反映到你所迭代的條目上.
在迭代字典的 key 時, 你絕對不能改變這個字典. 使用字典的 keys() 方法是可以的, 因為
keys() 返回一個獨立於字典的列表. 而迭代器是與實際物件繫結在一起的, 它將不會繼續執行下
去:
>>> myDict = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
>>> for eachKey in myDict:
... print eachKey, myDict[eachKey]
... del myDict[eachKey]
... a 1
Traceback (most recent call last):
File "", line 1, in ?
RuntimeError: dictionary changed size during iteration


這樣可以避免有缺陷的程式碼. 更多有關迭代器的細節請參閱 PEP 234 .