类具有默认值列表,并且所有实例都链接到Python

时间:2018-02-16 17:32:58

标签: python list class default mutable

上下文

这是我遇到的问题的简化版本。我找到了一个解决方案但仍然,我想找到另一个解决方案,并完全确定我的错误的根本原因。

我的问题:

此代码创建一个团队列表。每个团队都使用一个Team类实现,该类具有一个实例变量leader,它基本上是另一个名为Person的类。此Person类有一个他/她的家庭成员列表(Person Class的实例)。

问题是家庭成员列表指向不同团队的同一个对象。我的根本原因分析显示了两种可能性:

  1. 实例构造函数中的默认值列表( init )可能会将所有列表放在新的Person实例中以指向相同的列表[]。

  2. 列表追加方法始终使用相同的对象(列表)。

  3. 包含错误的代码:

    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:
        ((- [] -))
        ] -))
    

    最后的想法:

    我想听听您的意见和反馈。这是我的第一篇文章,所以请原谅我给您带来的任何不便。

    提前感谢您的帮助。

0 个答案:

没有答案