为什么 globals() 在迭代过程中改变了大小?
why globals() changed size during iteration?
如果使用下面的代码逐一打印globals()
键值对:
for k, v in globals().items():
# dict(globals()) working
print(k, v)
会出现这样的运行时错误:
RuntimeError: dictionary changed size during iteration
我知道 dict(globals())
可以冻结字典,所以没问题。
但我有点好奇在迭代过程中到底发生了什么变化?执行函数是自己的吗?
当您使用 global().items()
时,items
函数会创建一对包含名为 k
和 v
的迭代器,这就是 python 说的原因dictionary changed size during iteration
.
这是一个示例证明:
>>> globals()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>}
>>> for k, v in globals().items():
pass
Traceback (most recent call last):
File "<pyshell#16>", line 1, in <module>
for k, v in globals().items():
RuntimeError: dictionary changed size during iteration
>>> globals()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'k': '__name__', 'v': '__main__'}
>>>
请注意,在我再次调用 globals()
时出现错误后,它又包含 2 个值。
如果使用下面的代码逐一打印globals()
键值对:
for k, v in globals().items():
# dict(globals()) working
print(k, v)
会出现这样的运行时错误:
RuntimeError: dictionary changed size during iteration
我知道 dict(globals())
可以冻结字典,所以没问题。
但我有点好奇在迭代过程中到底发生了什么变化?执行函数是自己的吗?
当您使用 global().items()
时,items
函数会创建一对包含名为 k
和 v
的迭代器,这就是 python 说的原因dictionary changed size during iteration
.
这是一个示例证明:
>>> globals()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>}
>>> for k, v in globals().items():
pass
Traceback (most recent call last):
File "<pyshell#16>", line 1, in <module>
for k, v in globals().items():
RuntimeError: dictionary changed size during iteration
>>> globals()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'k': '__name__', 'v': '__main__'}
>>>
请注意,在我再次调用 globals()
时出现错误后,它又包含 2 个值。