Esempi
(vedere più avanti per una sintesi)
Ciò significa che se una variabile è mai assegnato a nel corpo di una funzione, allora sarà trattato come globale.
Questo spiega perché le seguenti opere (a
viene trattato come globale):
a = 1
def fn():
print a # This is "referencing a variable" == "reading its value"
# Prints: 1
Tuttavia, se la variabile viene assegnato da qualche parte nel corpo della funzione, allora saranno trattati come locale per l'intero corpo della funzione.
Ciò include le affermazioni trovate prima di a cui è assegnato (vedere l'esempio di seguito).
Questo spiega perché il seguente lavoro è non. Qui, a
è trattata come locali,
a = 1
def fn():
print a
a = 2 # <<< We're adding this
fn()
# Throws: UnboundLocalError: local variable 'a' referenced before assignment
Si può avere Python trattare una variabile come globale con la dichiarazione global a
. In tal caso, la variabile verrà considerata globale, , per l'intero corpo della funzione.
a = 1
def fn():
global a # <<< We're adding this
print a
a = 2
fn()
print a
# Prints: 1
# Then, prints: 2 (a changed in the global scope too)
Sommario
A differenza di quanto ci si potrebbe aspettare, Python non caduta di nuovo alla portata globale, se non riesce a trovare a
in ambito locale.
Ciò significa che una variabile è locale o globale per l'intero corpo funzione: non può essere globale e quindi diventare locale.
Ora, per quanto riguarda se una variabile viene considerata locale o globale, Python segue la seguente regola. Le variabili sono:
- globale se solo si fa riferimento e mai assegnato a
- globale se l'istruzione
global
viene utilizzato
- locale se la variabile è assegnato ad almeno una volta (e
global
non è stato utilizzato)
Note aggiuntive
infatti, "implic itly global "non significa realmente globale. Ecco un modo migliore per pensarci:
- "locale", "da qualche parte all'interno della funzione"
- "globale" in realtà significa "da qualche parte al di fuori della funzione"
Quindi, se una variabile viene "implicitamente globale" (== "al di fuori della funzione"), allora la sua "ambito di inclusione" sarà cercato prima:
a = 25
def enclosing():
a = 2
def enclosed():
print a
enclosed()
enclosing()
# Prints 2, as supplied in the enclosing scope, instead of 25 (found in the global scope)
Ora, come al solito, global
consente di fare riferimento alla sc globale OPE.
a = 25
def enclosing():
a = 2
def enclosed():
global a # <<< We're adding this
print a
enclosed()
enclosing()
# Prints 25, as supplied in the global scope
Ora, se avete bisogno di assegnare al a
in enclosed
, e voleva a
'il valore s di essere cambiato in enclosing
' ambito s, ma non in ambito globale, allora si avrebbe bisogno nonlocal
, che è nuovo in Python 3. In Python 2, non è possibile.
Attribuzione mancante: [Learning Python: potente programmazione orientata agli oggetti] (http://goo.gl/woLW0F) –
@A श wini च haudhary Fine :) – ajkumar25