2017-12-27 450 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])