我正(尝试)在我的程序中使用globals()来迭代所有的全局变量。我是这样做的:
for k, v in globals().iteritems():
function(k, v)当然,在这样做的过程中,我只是创建了另外两个全局变量:k和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这样处理相同异常的帖子。这是不同的,因为在不为每个字典条目指定变量名称的情况下,无法将其分配给每个字典条目。这样做会引发错误。
发布于 2017-12-28 01:22:26
您使用的是iteritems(),它遍历实时字典。您可以通过首先创建项的副本来避免这个问题;在Python2中,只需使用globals().items()
for k, v in globals().items():
function(k, v)在Python3中,您将首先使用list()将所有项对物化到一个列表中:
for k, v in list(globals().items()):
function(k, v)这个列表永远不会大到成为一个问题;模块全局变量很少会超过几十个项目。
如果您觉得即使是几十个元组也是一个问题,那么只为键创建一个列表:
for k in list(globals()): # python 2 and 3
function(k, globals()[k])https://stackoverflow.com/questions/47996181
复制相似问题