Python对象列表奇怪的行为

时间:2016-03-11 18:46:58

标签: python

我刚开始学习Python并且来自Java / C ++背景,并发现以下行为有点令人困惑。在调用s.add_trick(“Woof”)和d.add_trick(“Woof”)后,s.tricks和d.tricks都包含[“Woof”,“Bark”]。但是,调用party()没有相同的行为。谁能解释一下?

class PartyAnimal:
    x = 0
    name = ''
    tricks = []

    def __init__(self, name):
        self.name = name

    def party(self):
        self.x += 1

    def add_trick(self, trick):
        self.tricks.append(trick)

s = PartyAnimal("Sally")
d = PartyAnimal("Danny")

s.party()
d.party()
s.add_trick("Woof")
d.add_trick("Bark")

print 's', s.name, s.x, s.tricks
print 'd', d.name, d.x, d.tricks

输出是这样的:

s Sally 1 ['Woof', 'Bark']
d Danny 1 ['Woof', 'Bark']

1 个答案:

答案 0 :(得分:5)

您正在创建一个由所有类实例共享的tricks列表。请改为在__init__中创建一个新列表:

def __init__(self, name):
    self.name = name
    self.tricks = []