为什么两个类实例都更改了?

2024-05-14 11:18:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我在读this article关于Python函数式编程(3)

但是我不明白文中的这个例子:

class Bus(object):
     passengers = set()
     def add_passenger(self, person):
        self.passengers.add(person)

bus1 = Bus()
bus2 = Bus()
bus1.add_passenger('abe')
bus2.add_passenger('bertha')
bus1.passengers  # returns ['abe', 'bertha']
bus2.passengers  # also ['abe', 'bertha']

为什么在类的bus1实例上调用add\u passenger()会改变bus2的乘客集

当你不想要这种行为时,正确的方法是什么


Tags: 函数selfadd编程articlethis例子person
1条回答
网友
1楼 · 发布于 2024-05-14 11:18:46

Why would calling add_passenger() on bus1 instance of the class change the passenger set of bus2?

因为没有bus2的乘客组(也没有bus1的乘客组)。在本规范中:

class Bus(object):
     passengers = set()

passengers是一个在这个类的所有实例之间共享的类变量,但是不属于这些实例,而是属于类本身,因此当您更改self.passengers时,实际上更改了Bus.passengers,并且由于bus1.passengers和^{>引用了Bus.passengers,因此bus1.passengers == bus2.passengers总是正确的

如果不希望出现这种行为,请实现__init__方法:

class Bus:
    def __init__(self):
        self.passengers = set()

相关问题 更多 >

    热门问题