python - 为什么 globals() 在迭代期间改变大小?

标签 python python-3.x dictionary interpolation

如果使用下面的代码来一一打印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 说字典在迭代期间改变大小的原因。

这是一个示例证明:

>>> 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 个值。

关于python - 为什么 globals() 在迭代期间改变大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68374159/

相关文章:

Python - GPG 解密有效,但 GNUPG 无效

python - numpy.einsum 的输出形状

python-3.x - 当处理程序在 AWS lambda 中超时时如何处理剩余的负载?

python - Python 中列表的状态信息和不变性

python - 当 Python 3 中已经存在异常时引发异常

python - 重写我的分数文本文件以确保它只有最后 4 个分数 (python)

LINQ 将字典转换为查找

python - 从Python字典中提取id作为列表

python - 使用 Dask 加载多个 CSV 文件时混合列

python - 如何在 netcdf python 中传递复杂参数