2016-04-21 119 views
1

今天我遇到了python列表追加的奇怪问题。我试图创建一个数组,其每个元素都像C struct。其中一个元素本身就是一个列表。这是有问题的代码:Python列表追加问题

class players: 
    name='placeholder' 
    squad=list() 

teams=list() 
teams.append(players()) 
teams.append(players()) 
teams[0].name="abc" 
teams[1].name="xyz" 
teams[0].squad.append("Joe") 

for w in teams: 
    print(w.name) 
    print(w.squad) 

我期望的输出是:

abc 
['Joe'] 
xyz 
[] 

由于我只加一个构件到squad为团队[0]。但输出我得到的是:

abc 
['Joe'] 
xyz 
['Joe'] 

名称设置罚款,但.append它附加到teams两个元素!

是什么导致了这种情况,我该如何解决这个问题?

回答

11

原因是在你的类定义中,squadname是类变量,而不是实例变量。当一个新的player对象被初始化时,它基本上在玩家的所有实例中共享相同的squad变量。相反,您希望为player类定义一个__init__方法,该方法明确分隔了特定于实例的变量。

class players: 
    def __init__(self): 
     self.name = 'placeholder' 
     self.squad = [] 

然后,当你初始化你的新player对象,它有自己的squad变量。剩下的代码现在应该可以正常工作,只有正确的对象squad被追加到。

+0

谢谢!这解决了问题! –