1

重複の可能性:
Pythonの「驚き最小の原則」:可変のデフォルト引数

次のpythontest.pyモジュールを検討してください。

class Container:
    def __init__(self, str_list=[]):
        self.str_list = str_list

    def from_strings(self, st=""):
        self.str_list.append(st)
        return self

o1 = Container().from_strings(st="o1")
o2 = Container().from_strings(st="o2")
o3 = Container().from_strings(st="o3")

def prnt():
    print("o1's list:"+str(o1.str_list))
    print("o2's list:"+str(o2.str_list))
    print("o3's list:"+str(o3.str_list))

if __name__ == '__main__':
    prnt()

python test.py:の出力はなぜですか?

  o1's list:['o1', 'o2', 'o3']
  o2's list:['o1', 'o2', 'o3']
  o3's list:['o1', 'o2', 'o3']

それ以外の:

  o1's list:['o1']
  o2's list:['o2']
  o3's list:['o3']

(同じモジュール内の異なるインスタンスのフィールド(str_list)が混同される理由がわからないようです。この概念を説明するPythonドキュメントへのポインターをいただければ幸いです)

4

1 に答える 1

2

コンストラクターでデフォルト値として空のリストを作成しました。

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

このリストは一度だけ作成され、その後すべてのインスタンスで共有されます。インスタンスごとに個別のリストが必要な場合は、次のようにすることができます。

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

これで、各インスタンスが独自のリストを作成します。

編集:

何が起こっている?

1、またはなどのデフォルトの引数を使用'foo'したことがありますが、問題は発生していません。これらは操作できない不変のオブジェクトです。あなたがそう思うときはいつでも、あなたは代わりに新しいインスタンスを手に入れます。不変オブジェクトタイプのコレクションには、とりわけ、、、が含まれます。intstrtuple

ここ[]で、alistは、操作可能な可変オブジェクトです。したがって、属性を変更すると、実際のオブジェクトが変更され、その属性へのすべての参照に変更が反映されます。

于 2012-11-18T16:13:54.150 に答える