2017-12-27 16 views
1

Ich bin (versucht), globals() in meinem Programm zu verwenden, um durch alle globalen Variablen zu durchlaufen. Dies ist, wie ich es ging:Iterating durch globals() Wörterbuch

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

Natürlich dabei, ich habe gerade zwei weitere globale Variablen erstellt, k und v. So bekomme ich diese Ausnahme:

RuntimeError: dictionary changed size during iteration 

Und hier sind meine verschiedenen erfolglosen Versuche, das Problem zu lösen:

# 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) 

Ich habe wie this gesehen Beiträge, die mit der gleichen Ausnahme behandeln. Dies ist anders, weil es keine Möglichkeit gibt, jedem Wörterbucheintrag eine Variable zuzuweisen, ohne dafür einen Variablennamen zu erstellen ... und dies führt zu einem Fehler.

Antwort

5

Sie verwenden iteritems(), die über das Live-Wörterbuch iteriert. Sie können das Problem trivial vermeiden, indem Sie zuerst eine Kopie der Elemente erstellen. nur in Python 2 globals().items() verwenden:

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

In Python 3, dann würden Sie list() verwenden, um alle Artikel Paare in eine Liste materialisieren zuerst:

for k, v in list(globals().items()): 
    function(k, v) 

Diese Liste wird nie so groß sein, wie zu sein ein Problem; Modul Globals sind selten größer als ein paar Dutzend Artikel.

Wenn Sie das Gefühl, dass sogar ein paar Dutzend Tupeln ein Problem sind, dann erstellen Sie eine Liste für die Schlüssel nur:

for k in list(globals()): # python 2 and 3 
    function(k, globals()[k])