2009-10-19 6 views

Antwort

17

Wenn Sie

global var 

sagen Sie Python sagen, dass var die gleiche var ist, die in einem globalen Kontext definiert wurde. Sie würden es auf folgende Weise verwenden:

var=0 
def f(): 
    global var 
    var=1 
f() 
print(var) 
# 1 <---- the var outside the "def f" block is affected by calling f() 

Ohne die globale Aussage, die var innerhalb des „def f“ Block würde eine lokale Variable sein, und seinen Wert einstellen würde auf der var keine Wirkung außerhalb der "def f" -Block.

var=0 
def f(): 
    var=1 
f() 
print(var) 
# 0 <---- the var outside the "def f" block is unaffected 

Wenn Sie globals.update (var) sagen, ich bin zu raten Sie tatsächlich bedeuten Globals(). Update (var). Lasst es uns auseinander brechen.

globals() gibt ein dict-Objekt zurück. Die dict-Schlüssel sind die Namen von Objekten, und die dict-Werte sind die Werte des zugehörigen Objekts.

Jedes Diktat hat eine Methode namens "update". Also globals(). Update() ist ein Aufruf dieser Methode. Die Update-Methode erwartet mindestens ein Argument, und dieses Argument wird voraussichtlich ein dict sein. Wenn Sie Python sagen

globals().update(var) 

dann hatte var besser ein dict, und Sie sagen Python die Globals() dict mit dem Inhalt des var dict zu aktualisieren.

Zum Beispiel:

#!/usr/bin/env python 

# Here is the original globals() dict 
print(globals()) 
# {'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__file__': '/home/unutbu/pybin/test.py', '__doc__': None} 

var={'x':'Howdy'} 
globals().update(var) 

# Now the globals() dict contains both var and 'x' 
print(globals()) 
# {'var': {'x': 'Howdy'}, 'x': 'Howdy', '__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__file__': '/home/unutbu/pybin/test.py', '__doc__': None} 

# Lo and behold, you've defined x without saying x='Howdy' ! 
print(x) 
Howdy 
+0

Ok, so, wenn ich eine Variable in einer Methode deklariert ist, und daß Methode namens Globals() update ('var': '0'). Nur während der ersten Ausführung des Skripts, ich wäre nicht in der Lage, "var" auf die gleiche Weise wie eine Variable, die als "global var" deklariert wurde, im gesamten restlichen Code bei der zweiten Ausführung des Skripts? – frank

+0

globals(). Update ('var': '0') sollte globals() sein update ({'var': '0'}). Dies wirkt sich auf die globale Variable 'var' aus, auch wenn dieser Befehl in eine Methode eingefügt wurde. Das Verhalten dieser Befehle ist bei jeder Ausführung des Skripts gleich. Wenn dies Ihre Frage nicht beantwortet, schreiben Sie bitte Ihren Code, damit wir ein besseres Verständnis bekommen. – unutbu

+0

Ok, es ist kurz, aber die Formatierung wird seltsam: Versuch: \t i + = 1 außer Nameerror: \t i = 0 . Dieser Code wird in einer Hauptmethode enthalten sein, und ich kann sie nicht ändern oder keine Methodendeklarationen vor dem Code/außerhalb der Methode hinzufügen. Was ich tun kann, ist Code in der Hauptmethode nach diesem kleinen Codeschnipsel hinzuzufügen. Ich muss 'ich' als globale Variable agieren lassen, so dass es bei jeder folgenden Skriptausführung um '1' erhöht wird. – frank

Verwandte Themen