4

Pythonのクラス初期化関数について質問があります。各部屋に「アイテム」プロパティがあり、リストとして保存されている、テキストアドベンチャーゲームタイプの環境を作成しようとしていました。私は次のことを試しました:

クラスルーム:

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

しかし、これで私が見つけたのは、開始時にアイテムが定義されていないすべての部屋が空のリストだけでなく、同じ空のリストを取得することです。多数の部屋を作成し、そのうちの 1 つにアイテムを追加すると、そのアイテムはすべての部屋に表示されます。

簡単に修正できます (すべての部屋に空のリストを手動で割り当てます) が、なぜこれが起こるのかわかりません。部屋 a を作成すると a.items が空のリストとして作成され、部屋 b は b.items が作成されると想像できます。しかし、なぜこれらが同一になるのか、誰でも説明できますか? そして、毎回異なるリストを作成するデフォルト値で上記の関数を生成する方法はありますか?

乾杯、

ビリー。

4

1 に答える 1

4

Python のデフォルト パラメータを理解する必要があります。items=[] と記述すると、グローバル変数 [] が作成され、適切なパラメーターが指定されていない場合に item に割り当てられます。これは、アイテムがデフォルト値を取るたびに、同じ [] オブジェクトが割り当てられることを意味します。(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 に答える