Wie funktioniert die Arbeit mit Einheimischen?

Ich dachte, das würde 3 drucken, aber es druckt 1:

def f(): a = 1 exec("a = 3") print(a) 

2 Solutions collect form web for “Wie funktioniert die Arbeit mit Einheimischen?”

Dieses Problem wird in der Python3-Fehlerliste etwas diskutiert. Letztlich, um dieses Verhalten zu bekommen, müssen Sie:

 def foo(): ldict = locals() exec("a=3",globals(),ldict) a = ldict['a'] print(a) 

Und wenn Sie die Python3-Dokumentation auf exec überprüfen, sehen Sie die folgende Anmerkung:

Die Standard-Einheimischen wirken wie beschrieben für Funktions- locals() unten: Änderungen an dem Standard-Einheimischen Wörterbuch sollten nicht versucht werden. Führen Sie ein explizites Einheimischen Wörterbuch, wenn Sie die Auswirkungen des Codes auf die Einheimischen sehen müssen, nachdem die Funktion exec () zurückgegeben hat.

Unter Bezugnahme auf eine spezifische Nachricht auf dem Fehlerbericht , sagt Georg Brandl:

Um die Einheimischen einer Funktion auf der Fliege zu modifizieren, ist es nicht möglich, ohne mehrere Konsequenzen: Normalerweise werden die Einheimischen nicht in einem Wörterbuch gespeichert, sondern ein Array , dessen Indizes zum Zeitpunkt der Kompilierung aus den bekannten Gebietsschemata ermittelt werden. Das kollidiert zumindest mit neuen Einheimischen, die von exec hinzugefügt wurden. Die alte Exec-Anweisung umgangen, weil der Compiler wusste, dass, wenn ein exec ohne globals / locals args in einer Funktion aufgetreten wäre, dieser Namespace "unoptimiert" wäre, also nicht das Locals-Array verwenden würde. Da exec () nun eine normale Funktion ist, weiß der Compiler nicht, was "exec" gebunden werden kann und daher nicht besonders behandelt werden kann .

Der Schwerpunkt liegt auf mir.

So ist der Kern davon, dass Python3 die Verwendung von lokalen Variablen besser optimieren kann, indem er dieses Verhalten nicht standardmäßig zulässt.

Und um der Vollständigkeit willen, wie in den obigen Kommentaren erwähnt, funktioniert dies wie erwartet in Python 2.X:

 Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41) [GCC 4.3.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> def f(): ... a = 1 ... exec "a=3" ... print a ... >>> f() 3 

Wenn Sie in einer Methode sind, können Sie dies tun:

 class Thing(): def __init__(self): exec('self.foo = 2') x = Thing() print(x.foo) 

Hier können Sie mehr darüber erfahren

  • Messen der Zeit, die es braucht, damit eine Funktion in Python ausgeführt und ausgeführt wird
  • Gibt es eine "foreach" -Funktion in Python 3?
  • Klonen Sie ein Modul und nehmen Sie Änderungen an der Kopie vor
  • Erstellen Sie das Wörterbuch aus der 2-D-Liste
  • Ändern des Verzeichnisses, in dem .pyc-Dateien erstellt werden
  • Unterschiede zwischen Eingabebefehlen in Python 2.x und 3.x
  • Drucken "Foo", wenn sich ein Element in einer Liste befindet
  • TypeError: 'float' Objekt nicht iterable
  • Python-Integer-Division ergibt Float
  • Extrahiere eine bestimmte Spalte aus einem csv
  • Hinzufügen einer Liste von Listen in einem Listenverständnis
  • Python ist die beste Programmiersprache der Welt.