2013-10-09 2 views
0

J'ai ce code simple:constructeur Python bizarreries

class bfs: 
    vis=[] 
    bags=[] 
    def __init__ (self,x): 
     for i in p: #initializes vis with len(p) zeroes 
      self.vis.append(0) 
      print self.vis 
     self.vis[x]=1 #marks index x as visited 
     print self.vis 

p=raw_input("Input values: ").split() 
for i in range(0,len(p)): 
    p[i]=int(p[i]) 

q=[] 
for i in range(0,len(p)): 
    q.append(bfs(i)) 

print 
for i in q: 
    print i.vis 

Si je entrée, par exemple, les 3 chiffres, pourquoi dois-je obtenir cette sortie:

[0] 
[0, 0] 
[0, 0, 0] 
[1, 0, 0] 
[1, 0, 0, 0] 
[1, 0, 0, 0, 0] 
[1, 0, 0, 0, 0, 0] 
[1, 1, 0, 0, 0, 0] 
[1, 1, 0, 0, 0, 0, 0] 
[1, 1, 0, 0, 0, 0, 0, 0] 
[1, 1, 0, 0, 0, 0, 0, 0, 0] 
[1, 1, 1, 0, 0, 0, 0, 0, 0] 

[1, 1, 1, 0, 0, 0, 0, 0, 0] 
[1, 1, 1, 0, 0, 0, 0, 0, 0] 
[1, 1, 1, 0, 0, 0, 0, 0, 0] 

Au lieu de quelque chose comme ça? Le programme semble continuer à fonctionner avec un seul tableau dans tous les obj créés. Je ne comprends pas pourquoi. Toute aide serait gonflée.

+0

double possible de [ "moins Etonnement" en Python: L'argument par défaut Mutable] (http://stackoverflow.com/questions/1132941/least-astonishment-in-python-the-mutable-default-argument – smac89

+0

En relation: [Variables de classe statique en Python] (http://stackoverflow.com/questions/68645/static-class-variables-in-python) –

Répondre

2

Le problème est que vous définissez définir vis et bags en tant que partie de la classe (en tant que "références d'attribut"), au lieu de dans le constructeur. Essayez ceci:

class bfs: 
    def __init__(self, x): 
     self.vis = [] 
     self.bags = [] 
     # etc. 

Le documentation for class objects peut aider:

Attribut références utilisent la syntaxe standard utilisée pour toutes les références d'attribut en Python: obj.name. Les noms d'attribut valides sont tous les noms qui se trouvaient dans l'espace de noms de la classe lors de la création de l'objet de classe. Donc, si la définition de classe ressemblait à ceci:

class MyClass: 
    """A simple example class""" 
    i = 12345 
    def f(self): 
     return 'hello world' 

puis MaClasse.i et MaClasse.f sont des références d'attribut valides, renvoyant un entier et un objet de fonction, respectivement. Les attributs de classe peuvent également être assignés à, de sorte que vous pouvez changer la valeur de MyClass.i par affectation.

Il y a aussi un Dive Into Python page à ce sujet:

attributs de classe sont disponibles à la fois par référence directe à la classe et par une instance de la classe. Remarque: En Java, les variables statiques (appelées attributs de classe en Python) et les variables d'instance (appelées attributs de données en Python) sont définies immédiatement après la définition de la classe (une avec le mot-clé statique, une sans). En Python, seuls les attributs de classe peuvent être définis ici; Les attributs de données sont définis dans la méthode __init__.

+0

Cela a effectivement fait l'affaire. Je n'avais aucune idée que tu devais faire les choses de cette façon en Python. Merci – andrepd