2017-12-27 890 views
1

我(试图)在我的程序中使用globals()来迭代所有全局变量。这是我去一下吧:通过全局变量遍历()字典

for k, v in globals().iteritems(): 
    function(k, v) 

当然,在这样做时,我刚刚创建2个全局变量,kv。所以,我得到这个异常:

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具有相同的异常处理。这是不同的,因为没有办法为每个字典条目分配一个变量,而没有为它创建一个变量名......这样做会产生错误。

回答

5

您正在使用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])