0

私は昨年Pythonを学び、新しいプロジェクトで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属性は名前が付いaThingインスタンスで"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

[]をデフォルトとして使用する場合の問題は、インタープリターが最初に関数を作成するときに、デフォルトのパラメーターが1回だけ評価されることです。intまたは他の不変の型の場合、これは問題ありませんが、可変型(リスト、辞書、その場で変更できるもの)の場合、これは問題を引き起こします。最終的に発生するのは、すべてのインスタンスがThing同じを共有することcontentです。

このようにして、コンストラクターを呼び出すたびに空のリストが作成され、毎回新しいリストが作成されます。

于 2012-08-08T15:44:59.993 に答える