Verhalten der exec-Funktion in Python 2 und Python 3

Folgende code gibt unterschiedliche Ausgabe in Python2 und in Python3:

from sys import version

print(version)

def execute(a, st):
    b = 42
    exec("b = {}\nprint('b:', b)".format(st))
    print(b)
a = 1.
execute(a, "1.E6*a")

Python2 Drucke:

2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)]
('b:', 1000000.0)
1000000.0

Python3 Drucke:

3.2.3 (default, Apr 11 2012, 07:15:24) [MSC v.1500 32 bit (Intel)]
b: 1000000.0
42

Warum Python2 binden die variable b innerhalb der execute - Funktion, um die Werte in der Zeichenfolge der exec Funktion, während Python3 dies nicht tut? Wie kann ich erreichen, das Verhalten von Python2 im Python3? Ich habe bereits versucht, pass Wörterbücher für globals und locals zu exec Funktion in Python3, aber nichts funktionierte bisher.

--- EDIT ---

Nach der Lektüre Martijns Antwort, die ich weiter analysiert und diese mit Python3. Im folgenden Beispiel gebe ich die locals() dictionay als d zu exec, aber d['b'] druckt etwas anderes, als nur zu drucken b.

from sys import version

print(version)

def execute(a, st):
    b = 42
    d = locals()
    exec("b = {}\nprint('b:', b)".format(st), globals(), d)
    print(b)                     # This prints 42
    print(d['b'])                # This prints 1000000.0
    print(id(d) == id(locals())) # This prints True
a = 1.
execute(a, "1.E6*a")

3.2.3 (default, Apr 11 2012, 07:15:24) [MSC v.1500 32 bit (Intel)]
b: 1000000.0
42
1000000.0
True

Den Vergleich mit den ids d und locals() zeigt, dass Sie das gleiche Objekt. Aber unter diesen Bedingungen b sollten die gleichen sein, wie d['b']. Was ist falsch in meinem Beispiel?

print ist eine Anweisung in Python 2
Aber das ist nicht die Frage hier. Aber so ist exec, btw.
Aber in 2.7.2 exec als eine Funktion scheint zu funktionieren. Mittlerweile habe ich heraus gefunden, dass ich verwenden können eval zu gewinnen, das Ergebnis will ich nicht. Aber die Frage bleibt die gleiche. Ich habe auch versucht, diese außerhalb einer Funktion nennen. Dann beide Versionen das gleiche zu tun.
denn die Art und Weise Sie es verwenden, die Klammer nur die Gruppe der Meinungsäußerung, was bedeutet, dass in python 2 Sie sind der ignoriert.
Das würde bedeuten, dass b bleibt die gleiche, in Python2, richtig? Aber es änderte sich mit der exec - Anweisung oder Funktion in Python2 und nicht in Python3.

InformationsquelleAutor Holger | 2013-02-26

Schreibe einen Kommentar