PDA

View Full Version : [Python] global name is not defined


Heretic Curse
01-05-2013, 12:01
>>>class Carta:
... ListaSemi = ["Fiori", "Quadri", "Cuori", "Picche"]
... ListaRanghi = ["impossibile", "Asso", "2", "3", "4", "5", \
... "6", "7", "8", "9", "10", "Jack", "Regina", "Re"]
... def __init__(self, Seme=0, Rango=0):
... self.Seme = Seme
... self.Rango = Rango
... def __str__(self):
... return (self.ListaRanghi[self.Rango] + " di " + self.ListaSemi[self.Seme])
...
... def __cmp__(self, Altro):
... if self.Seme > Altro.Seme: return 1
... if self.Seme < Altro.Seme: return -1
...
... if self.Rango == ListaRanghi[1] and Altro.Rango != ListaRanghi[1]: return 1
... if self.Rango > Altro.Rango: return 1
... if self.Rango < Altro.Rango: return -1
...
... return 0

>>>F = Carta(1, 1)
>>>T = Carta(1, 13)
>>>F.__cmp__(T)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 15, in __cmp__
NameError: global name 'ListaRanghi' is not defined

non riesco a capire il perché di quell'errore. Dovrei per caso specificare le 2 liste all'interno di __cmp__? Non credo, per __str__ (che funziona) non è stato necessario :doh:

simo8
01-05-2013, 14:53
Ti dice che non è definita perchè non è una lista globale ma dell'oggetto , devi quindi specificarlo con self :
self.ListaRanghi

Heretic Curse
01-05-2013, 19:58
Ti dirò, avevo chiaramente pensato a questa soluzione, solo che non so se ho capito più di tanto la logica che ci sta dietro. In sostanza, se la Lista si fosse trovata al di fuori della classe punto o all'interno della definizione di __cmp__ avrebbe funzionato? mentre in questo caso, trovandosi appunto all'interno della classe devo richiamarla con self perché appunto self, in quanto presente come parametro di __init__, definisce il fatto che ci stiamo riferendo a delle liste presenti nella classe?
Spero di non aver fatto un discorso troppo ingarbugliato, è che se non capisco esattamente quello che succede poi lo dimentico :D

cdimauro
02-05-2013, 06:18
ListaRanghi è un membro della classe istanza, quindi per accedervi devi SEMPRE premettere il self.

Se fosse stata una variabile di modulo (globale) o un oggetto built-in (len, list, int, ecc.) puoi accedervi direttamente (tranne per le variabili definite in altri moduli che non hai importato col from MODULO import).

Heretic Curse
02-05-2013, 18:02
Ok, grazie mille per la delucidazione ;)

il commento di Donald Knuth nella tua firma mi ha messo paura D: non che in effetti Python sia complesso, ma un pomeriggio D:

cdimauro
03-05-2013, 05:09
Parliamo di un mostro sacro della programmazione. :p

Comunque Python a livello di linguaggio è abbastanza semplice da imparare per chi ha già parecchia esperienza. ;)