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

use*_*780 0 python python-3.x

我正在阅读有关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']
Run Code Online (Sandbox Code Playgroud)

为什么在该类的bus1实例上调用add_passenger()会更改bus2的乘客集?

当您不希望这种行为时,正确的方法是什么?

For*_*Bru 5

为什么在该类的bus1实例上调用add_passenger()会更改bus2的乘客集?

因为没有“乘客集bus2 ”(没有乘客设置bus1)。在此代码中:

class Bus(object):
     passengers = set()
Run Code Online (Sandbox Code Playgroud)

...... passengers是这是此类的所有实例共享一个类变量,但属于没有这些情况,但对类本身,所以当你改变self.passengers,你居然改变Bus.passengers,并且由于bus1.passengersbus2.passengers Bus.passengersbus1.passengers == bus2.passengers始终是真实的。

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

class Bus:
    def __init__(self):
        self.passengers = set()
Run Code Online (Sandbox Code Playgroud)