0

我去年学习了 Python,并且刚刚通过一个新项目重新开始学习。我一开始就遇到了障碍,经过大量研究文档后,我仍然感到困惑。我不得不相信这很简单,但我找不到。这是问题:

我在文件中设置了以下内容:

class Wrapper(object):
    def __init__(self, title=None):
        self.header = Thing("HEADER")
        if title is not None:
            self.header.content.append( Thing("TITLE", content=[str(title)]) )
        self.body = Thing("BODY")
        self.content = Thing("COMPLETE", content=[self.header, self.body])

class Thing(object):
    def __init__(self, name, content=[]):
        self.name = name
        self.content = content

然后从交互式提示我做:

>>> import things
>>> a = things.Wrapper("This is a title")

现在,我希望在这一点上的body属性a将是一个Thing实例,其名称"BODY"content由一个空列表组成。我惊讶地发现它content实际上是一个包含相同"TITLE"实例的列表a.header.content

>>> a.header.name
'HEADER'
>>> a.header.content
[<test.Thing object at 0xb752290c>]
>>> a.body.name
'BODY'
>>> a.body.content
[<test.Thing object at 0xb752290c>]
>>> a.body.content[0].name
'TITLE'
>>> a.body.content[0].content
['This is a title']

我一生都无法弄清楚如何a.body.content以这种方式分配。任何人都可以对此有所了解吗?

4

1 回答 1

1

尝试这个

class Thing(object):
    def __init__(self, name, content=None):
        if content is None:
            content = []
        self.name = name
        self.content = content

[] 作为默认值的问题是默认参数仅在解释器首次创建函数时评估一次。对于一个int或其他不可变类型,这很好,但对于可变类型(列表、字典、任何可以就地更改的东西),这会导致问题。最终发生的是所有实例Thing共享相同的content.

这样,每次调用构造函数时都会创建一个空列表,每次都会创建一个新列表。

于 2012-08-08T15:44:59.993 回答