Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 附加到列表实例的对象将显示在该列表的其他实例中_Python_Default_Mutable_Arguments - Fatal编程技术网

Python 附加到列表实例的对象将显示在该列表的其他实例中

Python 附加到列表实例的对象将显示在该列表的其他实例中,python,default,mutable,arguments,Python,Default,Mutable,Arguments,我写这段代码是为了练习面向对象编程 在这里,我试图将房子定义为房间列表,将每个房间定义为设备列表(例如,灯具) 首先,我创建了所有的对象,它们将两个房间附加到房子上,并将不同的设备附加到每个房间上。非常基本 问题是,设备似乎被附加到两个房间。为什么呢 守则: #! /usr/bin/python class House: def __init__(self, rooms = list()): self.rooms = rooms

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

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

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

问题是,设备似乎被附加到两个房间。为什么呢

守则:

#! /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>
已创建房屋
已创建R1房间
已创建房间R2
已创建设备lamp1
已创建设备lamp2
R1
R2
R1
房间R1>灯1
R2
房间R2>灯1

请注意,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')

其他类也是如此。

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

def __init__(self, name = 'a room', devs = list()):
    self.name = name
    self.devs = devs
    print('room ' + self.name + ' created')
要解决此问题,请编写如下代码:

def __init__(self, rooms = None):
    if rooms is None:
        rooms = []
    self.rooms = rooms
    print('house created')
其他班级也一样

def __init__(self, name = 'a room', devs = list()):
    self.name = name
    self.devs = devs
    print('room ' + self.name + ' created')
当您执行此操作时,
list()
实际上始终是相同的列表。不是每次调用构造函数都会得到一个新的空列表,而是得到相同的空列表。要解决这个问题,您需要复制一份

另外,
list()
更习惯地写为
[]

def __init__(self, name='a room', devs=[]):
    self.name = name
    self.devs = list(devs)
    print('room ' + self.name + ' created')
当您执行此操作时,
list()
实际上始终是相同的列表。不是每次调用构造函数都会得到一个新的空列表,而是得到相同的空列表。要解决这个问题,您需要复制一份

另外,
list()
更习惯地写为
[]

def __init__(self, name='a room', devs=[]):
    self.name = name
    self.devs = list(devs)
    print('room ' + self.name + ' created')

默认参数在方法声明时计算一次。然后,该值将用于对该方法的所有调用中


还有关于stackoverflow和如何执行的其他问题。

默认参数在方法声明时计算一次。然后,该值将用于对该方法的所有调用中


关于stackoverflow和如何执行还有其他问题。

+1:黄金法则:永远不要将可变对象用作默认值。+1:黄金法则:永远不要将可变对象用作默认值。您犯了一个经典错误。interjay的回答是正确的解释和解决方案。另请看这里:你犯了一个典型的错误。interjay的回答是正确的解释和解决方案。另请参见: