PDA

Visualizza la versione completa : [PYTHON] Variabili globali


Alaunt
22-06-2009, 12:32
Salve. Da poco sto smanettando col python, ma ho incontrato un problema che non riesco a risolvere:

ho una serie di funzioni chiamate in cascata, del tipo
Funzione1(bla,bla):
...
...
...Funzione2(blo,blo)
......
......
......Funzione3(blu,ble)
.........
.........
............
..................FunzioneN(pippo,pluto)
.......................
.......................
.......................

all'interno della FunzioneN, mi serve una variabile (tipo list), creata nella Funzione1.
E' vero che potrei passarla come argomento dalla Funzione1 alla Funzione2, alla F3, ... fino ad arrivare alla FunzioneN, per questo metodo, oltre a sembrarmi poco elegante, mi da l'impressione che consumi un sacco di memoria, creando numerose copie della variabile originale.

Leggendo su docs.python.org, mi sembra di aver capito che posso dichiarare una variabile globale anteponendogli l'attributo global; tuttavia ho provato ma non riesco a farlo funzionare in quanto mi da un errore:
global name variabile not defined

dov' che sbaglio?

grazie.

Metflar
22-06-2009, 12:35
Originariamente inviato da Alaunt
Salve. Da poco sto smanettando col python, ma ho incontrato un problema che non riesco a risolvere:

ho una serie di funzioni chiamate in cascata, del tipo
Funzione1(bla,bla):
...
...
...Funzione2(blo,blo)
......
......
......Funzione3(blu,ble)
.........
.........
............
..................FunzioneN(pippo,pluto)
.......................
.......................
.......................

all'interno della FunzioneN, mi serve una variabile (tipo list), creata nella Funzione1.
E' vero che potrei passarla come argomento dalla Funzione1 alla Funzione2, alla F3, ... fino ad arrivare alla FunzioneN, per questo metodo, oltre a sembrarmi poco elegante, mi da l'impressione che consumi un sacco di memoria, creando numerose copie della variabile originale.

Leggendo su docs.python.org, mi sembra di aver capito che posso dichiarare una variabile globale anteponendogli l'attributo global; tuttavia ho provato ma non riesco a farlo funzionare in quanto mi da un errore:
global name variabile not defined

dov' che sbaglio?

grazie.
ecco un esempio:


var=0 #globale
def funzione():
global var
var=1

Alaunt
22-06-2009, 13:18
Modulo pippo.py:

CONNECTED_PLAYERS=[]
import os
import time
....

Modulo pluto.py:


import pippo.py
def cerca_player(target):
x=0
global CONNECTED_PLAYERS
for con_player in CONNECTED_PLAYERS:
if con_player[2].find(target)!=-1:
id=con_player[0]
x=x+1
....
....


verificando tramite debugger trovi che nel namespace della funzione cerca_player(target) la variabile CONNECTED_PLAYERS non definita, e quando cerco di eseguire il for ho questo errore:
NameError: global name 'CONNECTED_PLAYERS' is not defined
:bh:

Metflar
22-06-2009, 15:03
cmq se nn erro nn serve che importi il modulo come pippo.py basta pippo, per il tuo problema dovrebbe bastare pippo.variabile senza usare global prova

Alaunt
22-06-2009, 15:55
ho gi provato cos:


import RedCap
def cerca_player(target):
x=0
for con_player in RedCap.CONNECTED_PLAYERS:
if con_player[2].find(target)!=-1:
id=con_player[0]
x=x+1
....
....


mi dava questo errore:

File "F:\\PythonProjects\\RedCap\\src\\plugins.py", line 133, in cerca_player
for con_player in RedCap.CONNECTED_PLAYERS:
', "AttributeError: 'module' object has no attribute 'CONNECTED_PLAYERS'

Metflar
22-06-2009, 16:02
guarda io ci ho provato e funziona

c.py


LISTA=[]

o.py


import c
c.LISTA=[1,2,3]

print c.LISTA
nn saprei che dirti :ciauz:

billiejoex
22-06-2009, 17:21
Se ti ritorna questo errore:

"AttributeError: 'module' object has no attribute 'CONNECTED_PLAYERS'"

...significa che quella variabile non l'hai definita da nessuna parte, n nel modulo principale, n in quello che importi.
Per "definire" intendo una cosa del tipo:

CONNECTED_PLAYERS = 0


Inoltre ti consiglio di non utilizzare global a meno che tu non ci sia proprio costretto.
Molto spesso pi saggio passarsi le variabili tra funzioni mediante argomento o molto pi semplicemente utilizzare una classe.

Loading