2010-01-18 1 views

Antwort

22

Per the docs, die exec Anweisung nimmt zwei optionale Ausdrücke, säumige zu globals() und locals(), und immer führt Änderungen (falls vorhanden) in dem locals() ein. So

, werden nur expliziter/spezifische/genaue ...:

>>> def myfunc(): 
... exec('myvar="boooh!"', globals()) 
... 
>>> myfunc() 
>>> myvar 
'boooh!' 

... und Sie werden globale Variablen clobber der Lage sein, Inhalte Ihres Herzens.

+0

Perfekt! Danke, es funktioniert super. :) – linkmaster03

3

Wie wäre es damit:

>>> myvar = 'test' 
>>> def myfunc(): 
...  exec('globals()["myvar"] = "changed!"') 
...  print(myvar) 
... 
>>> myfunc() 
changed! 
>>> print(myvar) 
changed! 

Es ist für mich 2.6 in Python gearbeitet.

EDIT: Eigentlich Erklärung Alex Martelli ist viel besser als meine :)

+0

Dies funktionierte für mich (Python 3.4.1, Win. 8.1) das obige nicht ... – bjd2385

4

Alex Antwort hinzu: obwohl, wenn auslassen Sie die Einheimischen/Globals Argumente, die sie zu den Einheimischen und Globals des Anrufers Standard, dies ist nur ein Bequemlichkeitshack; es tut nicht bedeutet, dass sie den vollständigen Ausführungskontext des Aufrufers erben. Insbesondere:

a. Zellen mit verschachtelten Bereichen sind für den ausgeführten Code nicht verfügbar. Dies schlägt fehl:

def f(): 
    foo= 1 
    def g(): 
     exec('print foo') 
    g() 
f() 

b. global Deklarationen werden nicht in den ausgeführten Code übernommen. Standardmäßig werden also wie im Beispiel geschriebene Variablen in das lokale Wörterbuch geschrieben. Allerdings könnten Sie es mit der Aussage

exec('global myvar\nmyvar = "changed!"') 
machen

Sie wollen nicht wirklich tun, wenn Sie es helfen können. global ist schon nicht nett und exec ist so ziemlich ein Code-Geruch in sich! Sie würden sie nicht kombinieren wollen, es sei denn, es gab wirklich keine Alternative.

Verwandte Themen