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方法表明,它返回一个列表.如果是这样,我应该(我认为)能够改变字典的值并且仍然安全地访问字典的每个元素,只要我不改变,添加或删除任何键.那是对的吗?
是的,这是安全的,至少在所有基于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)
文档可以更加清楚;-) 在迭代期间删除或添加键是不可预测的安全.你对这些价值观做了什么并不重要.