Python对象列表奇怪的行为

Python object list weird behaviour

本问题已经有最佳答案,请猛点这里访问。

我刚刚开始学习Python,来自Java/C++背景,发现下面的行为有点混乱。在调用s.add ou trick("woof")和d.add ou trick("woof")之后,s.tricks和d.tricks都包含["woof"、"bark"]。但是,调用方()的行为不同。有人能解释吗?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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

输出是这样的:

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


您正在创建一个由类的所有实例共享的tricks列表。在__init__中创建一个新列表,而不是:

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