2012-06-26 4 views
3

Le code suivant est un problème que j'ai rencontré et je cherche une explication. Le comportement du code différent de ce que je m'attendais. Ci-dessous le code sera ma sortie attendue, et la sortie réelle. Une dernière chose à noter, c'est que je comprends que ce code peut être «étrange», et que l'utilisation de range (1) est un peu étrange, c'est le moins qu'on puisse dire. La raison en est que cette occurrence exacte dans un programme (les plages étaient des variables mais à ces valeurs) a causé des problèmes. J'ai donc fait ce simple code pour le répliquer.Comportement étrange de Python avec List & Append

userList = [] 

class User(): 
    listA = [] 
    listB = [] 

    def setup(self): 
     for i in range(1): 
      self.listA.append('a') 
      self.listB.append('b') 

for i in range(5): 
    user = User() 
    userList.append(user) 

for i in range(len(userList)): 
    userList[i].setup() 

for i in range(len(userList)): 
    print str(userList[i].listA) 
    print str(userList[i].listB) 

Sortie prévue

['a'] 
['b'] 
['a'] 
['b'] 
['a'] 
['b'] 
['a'] 
['b'] 
['a'] 
['b'] 

de sortie réelle

['a','a','a','a','a'] 
['b','b','b','b','b'] 
['a','a','a','a','a'] 
['b','b','b','b','b'] 
['a','a','a','a','a'] 
['b','b','b','b','b'] 
['a','a','a','a','a'] 
['b','b','b','b','b'] 
['a','a','a','a','a'] 
['b','b','b','b','b'] 

Discussion

I apprécia te toute explication quant à la raison pour laquelle cela se produit. Je ne suis pas sûr si la fonction intégrée append() affecte d'une manière ou d'une autre tous les utilisateurs, ou si chaque utilisateur partage en quelque sorte leurs champs. En cours d'exécution sur Python 2.7.3.

+2

'listA' est une classe pas une variable d'instance – Voo

+0

En dépit d'être à l'intérieur de l'empreinte pour la classe User()? – user650658

+1

Oui, c'est une variable de classe bien qu'elle soit indentée au niveau d'une variable de classe –

Répondre

8

Comparez cela à votre code

class User(): 
    def setup(self): 
     self.listA = []       # instance variable 
     self.listB = []       # instance variable 
     for i in range(1): 
      self.listA.append('a') 
      self.listB.append('b') 

Notez qu'il est pas nécessaire de « déclarer » toutes les variables au niveau de la classe

+0

C'est vrai, mais j'essayais de comprendre comment faire ça. J'apprécie ton aide! Une autre question StackOverflow a également permis de discuter de la méthode __init__ pour qu'une classe déclare des variables de niveau classe. – user650658