Je suis encore relativement nouveau pour Python, et mon expérience OO vient de Java. J'ai donc un code que j'ai écrit en Python qui est agissant très inhabituel pour moi, étant donné le code suivant:Étendue et listes de 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'exécution de ce qui donne le résultat suivant:
['Hey!']
1
['Hey!', 'Hey!']
1
De toute évidence, je me attends les variables de classe pour aboutir aux mêmes données exactes, et la même sortie exacte ... Ce que je ne trouve nulle part est ce qui rend une liste différente de dire une chaîne ou un nombre, pourquoi la liste se référant à la même liste de la première instanciation dans les suivantes? Il est clair que je suis probablement en train de me méprendre sur une sorte de mécanique de portée ou de mécanique de création de liste.
Cela manque toujours le point clé; Voir la réponse de Ken. 'self.mynum + = 1' se développe en' self.mynum = self.mynum + 1'. Lorsque cela est exécuté, le côté droit est d'abord évalué. 'self.mynum' recherche' mynum' sur les instances, et ne parvient pas à le trouver (au moins la première fois que '__init__' est appelé), alors il recherche (et trouve)' mynum' sur la classe. Ainsi, 'self.mynum' sur le côté droit évalue à la valeur de' MyClass.mynum'. Cette valeur est maintenant affectée à 'self.mynum', qui se réfère ici à la variable d'instance. –