生成器中的iteritems和Python2中的删除,没有错误?

时间:2016-01-08 18:13:01

标签: python python-2.7

我有一种非常奇怪的担忧,就是这样:

for k, v in ((k, v) for k, v in mydict.iteritems() if v.update):
    print k
    del mydict[k]

我非常清楚我们不应该在迭代期间更改字典的键。 但是我期待一个" RuntimeError:字典在迭代期间改变了大小"没别的了。 我有时会得到一个价值,有时候什么都没有......

  

Osx上的Python v2.7.10

1 个答案:

答案 0 :(得分:0)

为我打破:

>>> mydict = {'a':1, 'b':10}
>>> for k, v in ((k, v) for k, v in mydict.iteritems() if v > 5):
...     print k
...     del mydict[k]
b
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
...

显然将其更改为items()可解决此问题:

>>> mydict = {'a':1, 'b':10}
>>> for k, v in ((k, v) for k, v in mydict.items() if v > 5):
...     print k
...     del mydict[k]
b
>>> mydict
{'a': 1}

但循环中的条件更清晰:

>>> mydict = {'a':1, 'b':10}
>>> for k, v in mydict.items():
...     if v > 5:
...         print k
...         del mydict[k]
b
>>> mydict
{'a': 1}

或者词典理解:

>>> mydict = {'a':1, 'b':10}
>>> {k: v for k, v in mydict.iteritems() if not v > 5}
{'a': 1}