Python 可变对象和迭代器 注意点

来源:互联网 发布:java保留两位小数 %.2 编辑:程序博客网 时间:2024/06/05 02:50
记住,在迭代可变对象的时候修改它们并不是个好主意. 这在迭代器出现之前就是一个问题.
一个流行的例子就是循环列表的时候删除满足(或不满足)特定条件的项:
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 1Traceback (most recent call last):File "", line 1, in ?RuntimeError: dictionary changed size during iteration


这样可以避免有缺陷的代码. 更多有关迭代器的细节请参阅 PEP 234 .
0 0
原创粉丝点击