Python: globals().items() iterations try to change a dict(PYTHON:Globals().Items()迭代尝试更改字典)
本文介绍了PYTHON:Globals().Items()迭代尝试更改字典的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
在cso.data.__init__.py中,我正在尝试执行以下操作:
from cso.data._features import * # import sumbodule
for k, v in globals().items():
if isinstance(v, entity):# entity is some type
print(k,v)
令我惊讶的是,我得到了:
Traceback (most recent call last):
File "X:ProgrammingworkspaceEclipsePyCommonSencesrccsodata\__init__.py", line 20, in <module>
from cso.data._features import *
File "X:ProgrammingworkspaceEclipsePyCommonSencesrccsodata\__init__.py", line 49, in <module>
for k, v in globals().items():
RuntimeError: dictionary changed size during iteration
出于某种原因,它试图以某种方式修改迭代的全局变量。怎么会这样呢?
有没有其他更好的方法来列出包中所有模块的name: value形式的所有变量?
列表理解等效项工作正常,但打印两次:
print([ (k, v) for k, v in globals().items() if isinstance(v, entity)])
这里发生了什么?
推荐答案
当您在全局范围内运行代码时,分配给的名称也是全局名称。k和v在开始迭代globals().items()之后首先被分配,这将在globals()词典中添加'k'和'v'的条目。
您可以通过在迭代前显式复制dict来避免这种情况,例如:
for k, v in globals().copy().items():
或在函数中执行工作(该函数将在局部作用域中存储迭代变量):
def print_global_entities():
for k, v in globals().items():
if isinstance(v, entity):# entity is some type
print(k,v)
if __name__ == '__main__':
print_global_entities()
这样做实际上会加快代码的引导速度;在函数外部,k和v对k和v的每次存储和加载都涉及dict查找,而在函数内部,Python可以(CPython引用解释器确实如此)使用简单的C数组查找和编译时计算的索引。
k和v预先存在,这样globals()dict就不会添加或删除项。您只需添加:
k = v = None
就在for循环之前。
这篇关于PYTHON:Globals().Items()迭代尝试更改字典的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:PYTHON:Globals().Items()迭代尝试更改字典
基础教程推荐
猜你喜欢
- PANDA VALUE_COUNTS包含GROUP BY之前的所有值 2022-01-01
- 修改列表中的数据帧不起作用 2022-01-01
- 包装空间模型 2022-01-01
- Plotly:如何设置绘图图形的样式,使其不显示缺失日期的间隙? 2022-01-01
- 使用大型矩阵时禁止 Pycharm 输出中的自动换行符 2022-01-01
- 在同一图形上绘制Bokeh的烛台和音量条 2022-01-01
- PermissionError: pip 从 8.1.1 升级到 8.1.2 2022-01-01
- 求两个直方图的卷积 2022-01-01
- 在Python中从Azure BLOB存储中读取文件 2022-01-01
- 无法导入 Pytorch [WinError 126] 找不到指定的模块 2022-01-01
