上下文
这是我遇到的问题的简化版本。我找到了一个解决方案但仍然,我想找到另一个解决方案,并完全确定我的错误的根本原因。
我的问题:
此代码创建一个团队列表。每个团队都使用一个Team类实现,该类具有一个实例变量leader,它基本上是另一个名为Person的类。此Person类有一个他/她的家庭成员列表(Person Class的实例)。
问题是家庭成员列表指向不同团队的同一个对象。我的根本原因分析显示了两种可能性:
实例构造函数中的默认值列表( init )可能会将所有列表放在新的Person实例中以指向相同的列表[]。
列表追加方法始终使用相同的对象(列表)。
包含错误的代码:
class Team():
def __init__(self, person):
self.leader = person
def __repr__(self):
return self.leader
class Person():
def __init__(self, name=None, family = []): #notice here default value
self.name = name
self.family = family
def __repr__(self):
return "Name: {}, Family:\n\t ((- {} -))\n\t".format(self.name,self.family)
team = []
team.append(Team(Person('John')))
team[0].leader.family.append(Person('Jake'))
team.append(Team(Person('Lucy')))
team[1].leader.family.append(Person('Jesus'))
for i in team:
print (i.leader)
控制台输出1:
正如你所看到的,最后,附加的家庭成员杰克和耶稣被错误地分配了。换句话说,它们被添加到同一个列表中。
Name: John, Family:
((- [Name: Jake, Family:
((- [...] -))
, Name: Jesus, Family:
((- [...] -))
] -))
Name: Lucy, Family:
((- [Name: Jake, Family:
((- [...] -))
, Name: Jesus, Family:
((- [...] -))
] -))
我的解决方案: 我删除了列表的默认值(默认情况下为空列表),现在我没有选择,只是每次创建一个新的Person实例时都会向构造函数传递一个空列表。
class Team():
def __init__(self, person):
self.leader = person
def __repr__(self):
return self.leader
class Person():
def __init__(self, name, family):
self.name = name
self.family = family
def __repr__(self):
return "Name: {}, Family:\n\t((- {} -))\n\t".format(self.name,self.family)
team = []
team.append(Team(Person('John', [])))
team[0].leader.family.append(Person('Jake', []))
team.append(Team(Person('Lucy', [])))
team[1].leader.family.append(Person('Jesus', []))
for i in team:
print (i.leader)
控制台输出2(正如预期):
Name: John, Family:
((- [Name: Jake, Family:
((- [] -))
] -))
Name: Lucy, Family:
((- [Name: Jesus, Family:
((- [] -))
] -))
最后的想法:
我想听听您的意见和反馈。这是我的第一篇文章,所以请原谅我给您带来的任何不便。
提前感谢您的帮助。