Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python2.7视图、for/in视图和修改视图是否能很好地协同工作?_Python_Python 2.7_Dictionary_Concurrentmodification_Dictview - Fatal编程技术网

Python2.7视图、for/in视图和修改视图是否能很好地协同工作?

Python2.7视图、for/in视图和修改视图是否能很好地协同工作?,python,python-2.7,dictionary,concurrentmodification,dictview,Python,Python 2.7,Dictionary,Concurrentmodification,Dictview,Python文档给出了在迭代dict时尝试修改dict的警告。这是否适用于视图 我理解视图是“活的”,因为如果您更改了基础dict,视图会自动反映更改。我也知道,如果添加或删除元素,dict的自然顺序可能会改变。这如何与for/in结合使用?你能安全地修改dict而不弄乱循环吗 d = dict() # assume populated dict for k in d.viewkeys(): # possibly add or del element of d for/in循环是否也迭

Python文档给出了在迭代dict时尝试修改dict的警告。这是否适用于视图

我理解视图是“活的”,因为如果您更改了基础dict,视图会自动反映更改。我也知道,如果添加或删除元素,dict的自然顺序可能会改变。这如何与for/in结合使用?你能安全地修改dict而不弄乱循环吗

d = dict()
# assume populated dict
for k in d.viewkeys():
    # possibly add or del element of d

for/in循环是否也迭代所有新元素?它是否缺少元素(因为顺序更改)?

是的,这适用于键或项的字典视图,因为它们提供字典内容的实时视图。您不能在迭代字典视图时向字典添加或删除键,因为正如您所说的,这会改变字典顺序

演示以表明事实确实如此:

>>> d = {'foo': 'bar'}
>>> for key in d.viewkeys():
...     d['spam'] = 'eggs'
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: dictionary changed size during iteration
>>> d = {'foo': 'bar', 'spam': 'eggs'}
>>> for key in d.viewkeys():
...    del d['spam']
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: dictionary changed size during iteration
>d={'foo':'bar'}
>>>对于d.viewkeys()中的键:
...     d['spam']=“鸡蛋”
... 
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
RuntimeError:字典在迭代期间更改了大小
>>>d={'foo':'bar','spam':'egs'}
>>>对于d.viewkeys()中的键:
...    del d['spam']
... 
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
RuntimeError:字典在迭代期间更改了大小

您可以更改值,即使在迭代“值”视图时也是如此,因为字典的大小不会随之更改,并且键的顺序保持不变。

使用
del
时,我没有遇到错误。您可以扩展您的答案来解决这个问题吗?@Ouroburus:还要注意,在Python 2中,
dict.keys()
dict.items()
dict.values()
函数首先使用这些键和/或值以设置的顺序创建一个新的列表对象,因此在循环中更改字典不会影响这些列表。这不是问题所在。@MartjinPieters这告诉我,我的代码中肯定有问题,但这是一个完全不同的问题。我确实有这样一个
del
,但是没有错误,根据您的回答,这意味着
del
没有运行。非常感谢。您自己尝试过吗?
iter(d)
d.iterkeys()
iter(d.viewkeys())
都是等效的。