3 Stimmen

vars() in Python mit unterschiedlicher Ausgabe

Wenn ich diesen Code ausführe:

a = '1'
vars()['a'] = '2'
print a

Ich erhalte die folgende Ausgabe:

2

Aber wenn ich diesen Code ausführe:

def bar():
    a = '1'
    vars()['a'] = '2'
    print a

bar()

Ich erhalte die folgende Ausgabe:

1

Meine Frage ist nun, warum das passiert und wie ich erreichen kann, dass der zweite Fall die gleiche Lösung wie der erste Fall liefert.

Bearbeiten:

Konnte nicht wirklich eine Lösung finden, aber ich habe einen kleinen Hack gefunden, um das Problem zu umgehen... Obwohl ich lieber nicht verwenden exec:

def bar():
    a = "a"
    b = "b"
    exec a+"="+b
    print a

bar()

So komme ich zum Ergebnis:

b

Wenn jemand eine bessere Lösung finden kann, wäre das großartig. Ich setze keine globalen Variablen auf diese Weise oder tun etwas verrückt, also keine Sorge darüber.

2voto

Silas Ray Punkte 25276

Es sieht so aus, als ob neue Stilklassen den Standard überschreiben __dict__ Verhalten und brechen damit die Verwendung von vars() . Ich bin mir nicht sicher, warum dies Auswirkungen auf die Klassen des alten Stils haben sollte, aber es könnte damit zusammenhängen.

Aus den Dokumenten (http://docs.python.org/library/functions.html#vars):


vars([object]) Rückgabe der __dict__ Attribut für ein Modul, eine Klasse, eine Instanz oder ein anderes Objekt mit einem __dict__ Attribut.

Objekte wie Module und Instanzen haben eine aktualisierbare __dict__ Attribut; andere Objekte können jedoch Schreibbeschränkungen für ihre __dict__ Attribute (z. B. verwenden Klassen des neuen Stils einen Dictproxy, um direkte Wörterbuchaktualisierungen zu verhindern).

Ohne ein Argument verhält sich vars() wie locals(). Beachten Sie, dass das locals-Wörterbuch nur für Lesevorgänge nützlich ist, da Aktualisierungen des locals-Wörterbuchs ignoriert werden.


Könnten Sie vielleicht erläutern, warum self. = val o setattr(self, 'x', val) für Ihren Klassenfall nicht funktionieren wird?

1voto

Alfe Punkte 51658

Zuweisung zum Ergebnis von vars() ist nicht definiert. Es könnte also in verschiedenen Szenarien und/oder Python-Versionen und/oder Implementierungen unterschiedliche Ergebnisse liefern. Obwohl es erschreckend klingen mag, lokale Variablen auf diese Weise ändern zu können (ich habe es einmal für Regex-Groupdict-Ergebnisse ausprobiert), ist dies höchst unportabel und könnte jederzeit kaputt gehen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X