我(尝试)使用globals()
在我的程序中迭代所有全局变量。我就是这样做的:
for k, v in globals().iteritems():
function(k, v)
当然,这样做时,我只是创建了另外 2 个全局变量,k
and v
。所以我得到这个异常:
RuntimeError: dictionary changed size during iteration
而且,以下是我解决该问题的各种不成功的尝试:
# Attempt 1:
g = globals()
for k, v in globals().iteritems():
function(k, v)
# Attempt 2 (this one seems to work, but on closer inspection it duplicates
#the last item in the dictionary, because another reference is created to it):
k = v = None
for k, v in globals().iteritems():
function(k, v)
我看过类似的帖子this https://stackoverflow.com/questions/10107676/python-runtimeerror-dictionary-changed-size-during-iteration处理相同的异常。这是不同的,因为没有办法在不为其指定变量名的情况下将变量分配给每个字典条目......这样做会引发错误。
您正在使用iteritems()
,它迭代实时字典。您可以通过先创建项目的副本来轻松避免该问题;在Python 2中只需使用globals().items()
:
for k, v in globals().items():
function(k, v)
在 Python 3 中,你可以使用list()
首先将所有项目对具体化为列表:
for k, v in list(globals().items()):
function(k, v)
这个清单永远不会大到成为一个问题;模块全局变量很少超过几十个项目。
如果您觉得即使是几十个元组也是一个问题,那么只需为键创建一个列表:
for k in list(globals()): # python 2 and 3
function(k, globals()[k])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)