Sono ancora abbastanza nuovo per Python e la mia esperienza OO proviene da Java. Così ho qualche codice che ho scritto in Python che sta agendo molto insolito per me, dato il seguente codice:Scopo ed elenchi di classe Python
class MyClass():
mylist = []
mynum = 0
def __init__(self):
# populate list with some value.
self.mylist.append("Hey!")
# increment mynum.
self.mynum += 1
a = MyClass()
print a.mylist
print a.mynum
b = MyClass()
print b.mylist
print b.mynum
L'esecuzione di questo risultato è la seguente output:
['Hey!']
1
['Hey!', 'Hey!']
1
Chiaramente, mi aspetterei le variabili di classe per ottenere gli stessi dati esatti e lo stesso risultato esatto ... Quello che non riesco a trovare da nessuna parte è ciò che rende una lista diversa da una stringa o un numero, perché la lista fa riferimento alla stessa lista da la prima istanziazione in quelli successivi? Chiaramente probabilmente sto fraintendendo un qualche tipo di meccanica dell'ambito o meccanica della creazione di elenchi.
Manca ancora il punto chiave; vedere la risposta di Ken. 'self.mynum + = 1' si espande in' self.mynum = self.mynum + 1'. Quando viene eseguito, prima viene valutato il lato destro. 'self.mynum' cerca' mynum' sulle istanze e non riesce a trovarlo (almeno la prima volta che viene chiamato '__init__'), quindi cerca (e trova)' mynum' nella classe. Quindi il 'self.mynum' sul lato destro valuta il valore di' MyClass.mynum'. Quel valore è ora assegnato a se stesso.mynum', che qui si riferisce alla variabile di istanza. –