4

我有一个关于Python 中的类初始化函数的查询。我正在尝试创建一个文本冒险游戏类型的环境,每个房间都有一个“项目”属性,存储为一个列表。我尝试了以下方法:

教室:

def __init__(self,items=[]):
    self.items=items

但是我发现,每个在启动时没有定义项目的房间不仅会得到一个空列表,还会得到相同的空列表。现在,如果我创建一堆房间并将一个项目附加到其中一个,则该项目会出现在每个房间中。

很容易修复(手动为每个房间分配一个空列表),但我不明白为什么会发生这种情况。我会想象创建房间 a 会将 a.items 创建为一个空列表,而房间 b 将创建 b.items。但是谁能解释为什么这些会是相同的?有没有办法用默认值生成上述函数,每次都创建一个不同的列表?

干杯,

比利。

4

1 回答 1

4

您必须了解python中的默认参数。当您编写 items=[] 时,您创建了一个全局变量 [],当没有提供适当的参数时,您将其分配给 item。这意味着每次 items 采用默认值时,都会为其分配相同的 [] 对象。(记住,在 Java 中,变量只是对对象的引用。所有项目变量都是对同一个对象的引用)。

正式解释: http ://effbot.org/zone/default-values.htm

你可以做的是:

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

这样,默认值 None 永远不会改变。当发现时,会创建一个新列表(这次是一个真正的新列表,而不是全局列表)。

于 2012-05-17T18:31:44.400 回答