在generator中迭代items,在Python2中删除,没有错误



我有一个非常奇怪的担忧,用这种方式:

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

我的突破:

>>> 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}

最新更新