Python 遍历globals()字典

Python 遍历globals()字典,python,iteration,Python,Iteration,我正在(尝试)在程序中使用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 i

我正在(尝试)在程序中使用
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)

我见过类似的帖子也有同样的例外。这是不同的,因为在没有为每个字典条目指定变量名的情况下,无法为每个字典条目指定变量。。。这样做会导致错误。

您正在使用迭代实时字典的
iteritems()
。您可以通过先创建项目的副本来避免问题;在Python 2中,只需使用
globals().items()

在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])
for k in list(globals()):  # python 2 and 3
    function(k, globals()[k])