迭代my_dict.keys()并修改字典中的值会使迭代器失效吗?

Dan*_*iel 4 python iterator undefined-behavior

我的例子是这样的

for my_key in my_dict.keys():
    my_dict[my_key].mutate()
Run Code Online (Sandbox Code Playgroud)

是否定义了上述代码的行为(假设my_dict是一个字典并且mutate是一个改变其对象的方法)?我担心的是,改变字典中的值可能会使字典键上的迭代器无效.

在另一方面,Python文档中的keys方法表明,它返回一个列表.如果是这样,我应该(我认为)能够改变字典的值并且仍然安全地访问字典的每个元素,只要我不改变,添加或删除任何键.那是对的吗?

Tim*_*ers 6

是的,这是安全的,至少在所有基于C的Python实现中都是如此.它也是安全的:

for my_key in my_dict: # NOTE:  no .keys() here
    my_dict[my_key].mutate()
Run Code Online (Sandbox Code Playgroud)

也就是说,安全性不依赖于实现密钥列表,并且通常更有效的是不调用.keys()仅仅迭代密钥.

编辑

请注意,在迭代期间完全替换与现有键关联的值也可以:

for my_key in my_dict:
    my_dict[my_key] = something_new()
Run Code Online (Sandbox Code Playgroud)

文档可以更加清楚;-) 在迭代期间删除或添加键是不可预测的安全.你对这些价值观做了什么并不重要.