Se creo una variabile globale in una funzione, come posso usare quella variabile in un'altra funzione?
Possiamo creare un globale con la seguente funzione:
def create_global_variable():
global global_variable # must declare it to be a global first
# modifications are thus reflected on the module's global scope
global_variable = 'Foo'
La scrittura di una funzione non esegue effettivamente il suo codice. Quindi chiamiamo la create_global_variable
funzione:
>>> create_global_variable()
Utilizzo dei globali senza modifiche
Puoi semplicemente usarlo, purché non ti aspetti di cambiare l'oggetto a cui punta:
Per esempio,
def use_global_variable():
return global_variable + '!!!'
e ora possiamo usare la variabile globale:
>>> use_global_variable()
'Foo!!!'
Modifica della variabile globale dall'interno di una funzione
Per puntare la variabile globale su un oggetto diverso, è necessario utilizzare nuovamente la parola chiave globale:
def change_global_variable():
global global_variable
global_variable = 'Bar'
Si noti che dopo aver scritto questa funzione, il codice che la modifica effettivamente non è ancora stato eseguito:
>>> use_global_variable()
'Foo!!!'
Quindi dopo aver chiamato la funzione:
>>> change_global_variable()
possiamo vedere che la variabile globale è stata cambiata. Il global_variable
nome ora indica 'Bar'
:
>>> use_global_variable()
'Bar!!!'
Nota che "globale" in Python non è veramente globale, è solo globale a livello di modulo. Quindi è disponibile solo per le funzioni scritte nei moduli in cui è globale. Le funzioni ricordano il modulo in cui sono scritte, quindi quando vengono esportate in altri moduli, continuano a cercare nel modulo in cui sono state create per trovare le variabili globali.
Variabili locali con lo stesso nome
Se crei una variabile locale con lo stesso nome, oscurerà una variabile globale:
def use_local_with_same_name_as_global():
# bad name for a local variable, though.
global_variable = 'Baz'
return global_variable + '!!!'
>>> use_local_with_same_name_as_global()
'Baz!!!'
Ma l'uso di quella variabile locale erroneamente non cambia la variabile globale:
>>> use_global_variable()
'Bar!!!'
Nota che dovresti evitare di usare le variabili locali con gli stessi nomi dei globali a meno che tu non sappia esattamente cosa stai facendo e abbia un'ottima ragione per farlo. Non ho ancora incontrato un tale motivo.
Abbiamo lo stesso comportamento in classe
Un commento di follow-up chiede:
cosa fare se voglio creare una variabile globale all'interno di una funzione all'interno di una classe e voglio usare quella variabile all'interno di un'altra funzione all'interno di un'altra classe?
Qui dimostro che nei metodi otteniamo lo stesso comportamento delle normali funzioni:
class Foo:
def foo(self):
global global_variable
global_variable = 'Foo'
class Bar:
def bar(self):
return global_variable + '!!!'
Foo().foo()
E adesso:
>>> Bar().bar()
'Foo!!!'
Ma suggerirei invece di utilizzare le variabili globali di utilizzare gli attributi di classe, per evitare di ingombrare lo spazio dei nomi del modulo. Nota anche che non usiamo self
argomenti qui - questi potrebbero essere metodi di classe (utile se si modifica l'attributo di classe dal solito cls
argomento) o metodi statici (no self
o cls
).