Che cos'è una dichiarazione globale ? E come viene usato? Ho letto Python's official definition;
tuttavia, non ha molto senso per me.In Python che cos'è una dichiarazione globale?
risposta
Ogni "variabile" in Python è limitata ad un certo ambito. L'ambito di un "file" python è l'ambito modulo. Si consideri il seguente:
#file test.py
myvariable = 5 # myvariable has module-level scope
def func():
x = 3 # x has "local" or function level scope.
oggetti con ambito locale muoiono non appena la funzione termina e non può mai essere recuperate (a meno che non return
loro), ma all'interno di una funzione, è possibile accedere alle variabili del perimetro livello del modulo (o qualsiasi ambito che contiene):
myvariable = 5
def func():
print(myvariable) # prints 5
def func2():
x = 3
def func3():
print(x) # will print 3 because it picks it up from `func2`'s scope
func3()
Tuttavia, non è possibile utilizzare l'assegnazione su quella di riferimento e si aspettano che sarà propagato a un ambito esterno:
myvariable = 5
def func():
myvariable = 6 # creates a new "local" variable.
# Doesn't affect the global version
print(myvariable) # prints 6
func()
print(myvariable) # prints 5
Ora, siamo finalmente a global
. La parola chiave global
è il modo in cui si dice a python che una particolare variabile nella propria funzione è definita a livello globale (a livello di modulo).
myvariable = 5
def func():
global myvariable
myvariable = 6 # changes `myvariable` at the global scope
print(myvariable) # prints 6
func()
print(myvariable) # prints 6 now because we were able
# to modify the reference in the function
In altre parole, è possibile modificare il valore della myvariable
nel modulo-scope dall'interno func
se si utilizza la parola chiave global
.
Per inciso, gli ambiti possono essere nidificate arbitrariamente profondo:
def func1():
x = 3
def func2():
print("x=",x,"func2")
y = 4
def func3():
nonlocal x # try it with nonlocal commented out as well. See the difference.
print("x=",x,"func3")
print("y=",y,"func3")
z = 5
print("z=",z,"func3")
x = 10
func3()
func2()
print("x=",x,"func1")
func1()
Ora, in questo caso, nessuna delle variabili sono dichiarate in ambito globale, e in python2, non c'è (facile/clean) per modificare il valore di x
nell'ambito di func1
dall'interno di func3
. Ecco perché la parola chiave nonlocal
è stata introdotta in python3.x. nonlocal
è un'estensione di global
che consente di modificare una variabile prelevata da un altro ambito in qualsiasi ambito da cui è stata estratta.
+1 per una spiegazione approfondita. Tuttavia, potresti voler mostrare i risultati delle dichiarazioni di stampa. –
@StevenRumbalski - Fatto. Buon suggerimento – mgilson
Testato da solo dopo aver letto la tua risposta e la mia comprensione è notevolmente migliorata su questo argomento. Grazie mille! – Capurnicus
Fondamentalmente dice all'interprete che la variabile data deve essere modificata o assegnata a livello globale, piuttosto che il livello locale predefinito.
a = 1
def f():
a = 2 # doesn't affect global a, this new definition hides it in local scope
a = 1
def f():
global a
a = 2 # affects global a
È possibile utilizzare una variabile globale in altre funzioni dichiarando come global in ogni funzione che lo modifica
Python vuole assicurarsi che tu non sappia che è quello che si sta giocando con esplicitamente richiedendo la parola chiave globale.
Vedi this answer
mgilson ha fatto un buon lavoro ma vorrei aggiungere altro.
list1 = [1]
list2 = [1]
def main():
list1.append(3)
#list1 = [9]
list2 = [222]
print list1, list2
print "before main():", list1, list2
>>> [1] [1]
main()
>>> [1,3] [222]
print list1, list2
>>> [1, 3] [1]
all'interno di una funzione, Python assume ogni variabile come variabile locale a meno che non si dichiara come globale, o si accede a una variabile globale.
list1.append(2)
era possibile perché si accede alla "lista1" e gli elenchi sono modificabili.
list2 = [222]
era possibile perché si sta inizializzando una variabile locale.
Tuttavia, se si decommentare # list1 = [9], si otterrà
UnboundLocalError: local variable 'list1' referenced before assignment
Significa che si sta tentando di inizializzare una nuova variabile locale 'lista1', ma era già fatto riferimento in precedenza, e siete fuori dal campo di applicazione per riassegnarlo.
Per inserire l'ambito, dichiarare "elenco1" come globale.
Si consiglia vivamente di leggere this anche se c'è un errore di battitura alla fine.
- 1. Nome globale in Python
- 2. Trovare una dichiarazione di stampa in Python
- 3. Che cosa significa "_" in una dichiarazione Golang?
- 4. Un'alternativa al globale in Python
- 5. Ambito globale variabile Python
- 6. Registrazione globale Python
- 7. Applicazione WPF che utilizza una variabile globale
- 8. Come si dichiara una costante globale in Python?
- 9. Perché non posso impostare una variabile globale in Python?
- 10. Codifica in XML dichiarazione python
- 11. Stato globale nel modulo Python
- 12. In che modo Cloud9 accetta una variabile "globale"?
- 13. Python: prova la dichiarazione in una riga singola
- 14. python: ottenere l'output di stampa in una dichiarazione exec
- 15. Variabile globale e fiaschetta python
- 16. python: tag dichiarazione xml.etree.elementtree.ElemenTtree.write()
- 17. Variabile globale nel server Python
- 18. Informazioni sulla variabile globale in Python
- 19. Dichiarazione di una variabile globale da utilizzare in tutte le attività
- 20. WPF: aggiunta globale della dichiarazione dello spazio dei nomi xaml
- 21. Python: dichiarazione del passaggio in forma lambda
- 22. Che cosa fa esattamente una dichiarazione di ritorno in C#?
- 23. Che cosa fa @! significa in una dichiarazione From
- 24. Python globale variabile non aggiornare
- 25. contesto multipla `with` dichiarazione in Python 2.6
- 26. Python dichiarazione breve 'if-else'
- 27. cursore SQLite in Python con la dichiarazione
- 28. Perché Python 2.6 ha aggiunto una funzione next() globale?
- 29. + !! operatore in una dichiarazione if
- 30. Come creare una matrice globale?
solo un commento, 2.4 è una vecchia versione di python, il riferimento effettivo per [python 2.X versione è qui] (http://docs.python.org/2/reference/simple_stmts.html#global) –
Python 3 viene fornito con la nuova istruzione 'nonlocal' insieme a' global', vedi anche tu. –
@TahaJahangir - Questo è un buon punto. Ho anche aggiunto un po 'di confusione a 'nonlocal' nella mia risposta a causa del tuo commento. Grazie! – mgilson