附加到对象中的数组会附加到所有实例

时间:2019-04-19 22:29:50

标签: python python-3.x

我正在研究基于文本的游戏。我试图通过遵循所有约定来使其尽可能有条理和专业。

我有一个Map类,如下所示:

import logging
#local imports
import Npc

class Map:
    def __init__(self, name, npcs = []):
        self.name = name
        connections = []
        if all(isinstance(item, Npc) for item in npcs):
            self.npcs = npcs
        else:
            raise Exception("An NPC was not an instance of NPC")


    def addConnection(self, connection):
        if(connection == self):
            return
        self.name = connection.name
        self.connections.append(connection)

我的Main类为这些地图创建了两个实例,分别名为forest和village。 这段代码的重点是将村庄添加到森林的连接数组中:

village = Map("Village")
forest = Map("Forest")
forest.addConnection(village)

看起来很简单。但是由于某种原因,当运行forest.addConnection(village)时,或者即使我执行forest.connections.append(village),Map实例“村庄”也会被添加到森林和村庄的连接数组中。

根据调试器,在forest.addConnection(village)运行之后, 我的两个对象如下所示:

village (Map)
|------> name="village"
|------> connections = [village]

forest (Map)
|------> name="forest"
|------> connections = [village]

为什么会这样?我在代码中的任何地方都没有向Village的连接数组添加任何内容。我不了解关于Python的面向对象编程的东西吗?我应该让乡村和森林类继承或扩展Map类吗?

预先感谢所有帮助。

2 个答案:

答案 0 :(得分:-1)

尽量避免将构造函数作为函数的默认参数调用。 这是造成您问题的原因。

示例:

>>> class Map():
...     def __init__(self, a=list()): # do __init__(self, a=[]) produce same result
...             print(a)
...             a.append("hello")
... 
>>> b = Map()
[]
>>> b = Map()
['hello']
>>> b = Map()
['hello', 'hello']
>>> b = Map()
['hello', 'hello', 'hello']
>>> b = Map()
['hello', 'hello', 'hello', 'hello']

如此行事:

def __init__(self, name, npcs = []):
    self.name = name
    ...

def __init__(self, name, npcs = None):
    if npcs is None:
        npcs = []
    self.name = name
    ...

答案 1 :(得分:-1)

发现了问题。 @iElden让我在正确的地方寻找。 在构造函数中,我set connections = [],而不是self.connections = []

感谢您的回复!