Skip to main content
 首页 » 编程设计

python之附加到列表实例的对象出现在该列表的不同实例中

2025年05月04日10cmt

我写这段代码是为了练习面向对象的编程。

在这里,我尝试将房子定义为房间列表,将每个房间定义为设备列表(例如灯)。

首先,我创建了所有对象,并将两个房间附加到房子,并为每个房间附加了不同的设备。非常基本。

问题是该设备似乎被附加到两个房间。这是为什么?

代码:

#! /usr/bin/python 
 
class House: 
        def __init__(self, rooms = list()): 
                self.rooms = rooms 
                print('house created') 
 
 
class Room: 
        def __init__(self, name = 'a room', devs = list()): 
            self.name = name 
            self.devs = devs 
            print('room ' + self.name + ' created') 
 
 
class Device: 
        def __init__(self, name = 'a device'): 
                self.name = name 
                print('device ' + self.name + ' created') 
 
 
def main(): 
        #1 
        h = House() 
        r1 = Room(name = 'R1') 
        r2 = Room(name = 'R2') 
        d1 = Device(name = 'lamp1') 
        d2 = Device(name = 'lamp2') 
 
        #2 
        h.rooms.append(r1) 
        h.rooms.append(r2) 
 
        for room in  h.rooms: 
                print room.name 
 
        print h.rooms[0] 
        print h.rooms[1] 
        h.rooms[1].devs.append(d1) 
 
        #3 
        for room in h.rooms: 
                print room.name 
                for dev in room.devs: 
                        print('room ' + room.name + ' > ' + dev.name) 
                        print room 
                        print dev 
 
 
if __name__ == '__main__' : main() 

和输出。

house created 
room R1 created 
room R2 created 
device lamp1 created 
device lamp2 created 
R1 
R2 
<__main__.Room instance at 0xb7d8a58c> 
<__main__.Room instance at 0xb7d8a5ac> 
R1 
room R1 > lamp1 
<__main__.Room instance at 0xb7d8a58c> 
<__main__.Device instance at 0xb7d8a5cc> 
R2 
room R2 > lamp1 
<__main__.Room instance at 0xb7d8a5ac> 
<__main__.Device instance at 0xb7d8a5cc> 

请注意,d1 的同一个实例在两个房间 r1 和 r2 中。

请您参考如下方法:

函数的默认参数值只计算一次。这意味着 House 的所有实例都将为 self.rooms 使用相同的列表实例(如果在构造中未给出 rooms 参数)。以同样的方式,Room 的所有实例将共享相同的 self.devs 列表。

为了解决这个问题,编写如下代码:

def __init__(self, rooms = None): 
    if rooms is None: 
        rooms = [] 
    self.rooms = rooms 
    print('house created') 

其他类也一样。