2009-10-19 17 views

risposta

17

Quando si dice

global var 

si sta dicendo Python che var è lo stesso var che è stato definito in un contesto globale. si dovrebbe utilizzare nel seguente modo:

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

Senza la dichiarazione globale, il var all'interno del blocco "def f" sarebbe una variabile locale, e impostando il suo valore non avrebbe alcun effetto sulla var esterna il blocco "def f".

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

Quando si dice globals.update (var) sto indovinando che in realtà vuol dire globali(). Update (Var). Facciamo a pezzi.

globals() restituisce un oggetto dict. Le chiavi del dict sono i nomi degli oggetti, ei valori del dict sono i valori dell'oggetto associato.

Ogni dict ha un metodo chiamato "aggiornamento". Quindi globals(). Update() è una chiamata a questo metodo. Il metodo di aggiornamento prevede almeno un argomento e tale argomento è previsto come dettato. Se dite Python

globals().update(var) 

poi var era meglio essere un dizionario, e vi dicono Python per aggiornare le variabili globali() dict con il contenuto del var dict.

Ad esempio:

#!/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, se avevo una variabile dichiarata in un metodo, e dal fatto che metodo chiamato globals() aggiornamento ('var': '0'). Solo durante la prima esecuzione dello script, non sarei in grado di usare 'var' nello stesso modo di una variabile che è stata dichiarata come "var globale", in tutto il resto del codice alla seconda esecuzione dello script? – frank

+0

globals(). Update ('var': '0') dovrebbe essere globals(). Update ({'var': '0'}). Questo influenzerà la variabile globale 'var', anche se questo comando è stato inserito in un metodo. Il comportamento di questi comandi è lo stesso in ogni esecuzione dello script. Se questo non risponde alla tua domanda, per favore pubblica il tuo codice in modo che possiamo ottenere una migliore comprensione. – unutbu

+0

Ok, è breve ma la formattazione sarà strano: prova: \t i + = 1 tranne NameError: \t i = 0 . Quel codice sarà in un metodo principale, e non posso cambiarlo, né aggiungere dichiarazioni di metodi prima del codice/al di fuori del metodo. Quello che posso fare è aggiungere il codice nel metodo principale dopo questo piccolo snippet di codice. Devo fare in modo che 'i' agisca come una variabile globale, in modo che aumenti di '1' su ogni esecuzione di script successiva. – frank

Problemi correlati