Exec-Funktionsverhalten in Python 2 im Vergleich zu Python 3
Die exec-Anweisung weist deutliche Unterschiede im Verhalten zwischen Python 2 und Python 3 auf. In Python 2 fungierte exec als Anweisung und änderte effektiv lokale Variablen innerhalb des Funktionsumfangs.
In Python 3 jedoch exec() wird zu einer Funktion. Dies verhindert die Änderung lokaler Variablen innerhalb von Funktionen, obwohl dies in Python 2 möglich ist. Darüber hinaus sind selbst zuvor deklarierte Variablen nicht änderbar.
Die Funktion locals() ermöglicht nur die einseitige Aktualisierung lokaler Variablen. Zum Beispiel im folgenden Python 2-Code:
def foo(): a = 'spam' locals()['a'] = 'ham' print(a) # prints 'spam'
Die Zuweisung von 'ham' zu locals()['a'] hat keinen Einfluss auf den Wert der Variablen 'a' innerhalb der Funktion und „Spam“ bleibt gedruckt.
In Python 2 kopierte exec mithilfe von PyFrame_LocalsToFast die in locals() gefundenen Variablen explizit zurück in die Funktion locals. In Python 3 ist dieses Verhalten jedoch nicht mehr möglich.
Um das gewünschte Verhalten in Python 3 zu erreichen, muss man während des exec()-Aufrufs einen neuen Namespace (z. B. ein Wörterbuch) verwenden. Dies ist im folgenden Python 3-Code zu sehen:
def execute(a, st): namespace = {} exec("b = {}\nprint('b:', b)".format(st), namespace) print(namespace['b'])
In der exec()-Dokumentation werden ausdrücklich die Einschränkungen aufgeführt, die der Verwendung von locals() auferlegt werden:
"Hinweis: Die Standard-Locals verhalten sich als unten für die Funktion locals() beschrieben: Änderungen am Standard-Locals-Wörterbuch sollten nicht versucht werden, ein explizites Locals-Wörterbuch zu übergeben, wenn Sie die Auswirkungen des Codes auf Locals nach der Funktion exec() sehen möchten. kehrt zurück.
Das obige ist der detaillierte Inhalt vonWie unterscheidet sich das Verhalten von Exec-Funktionen zwischen Python 2 und Python 3?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!