質問

次の理由:

class A(object):
    def __init__(self, var=[]):
        self._var = var
        print 'var = %s %s' % (var, id(var))

a1 = A()
a1._var.append('one')

a2 = A()

結果:

var = [] 182897439952
var = ['one'] 182897439952

オプションのキーワード引数を使用するときに、リストの新しいインスタンスを使用しない理由がわかりません。誰でも説明できますか?

役に立ちましたか?

解決

関数定義内の空のリストは、関数自体が作成されるときに一度作成されます。関数が呼び出されるたびに作成されるわけではありません。

毎回新しいものが必要な場合は、これを行います:

class A(object):
    def __init__(self, var=None):
        if var is None:
            var = []
        self._var = var

他のヒント

これは単に間違っています。関数宣言のデフォルト値として可変オブジェクトを(意味的に)提供することはできません。

class A(object):
    def __init__(self, var=[]):
        self._var = var
        print 'var = %s %s' % (var, id(var))

このようなことをする必要があります。

class A(object):
    def __init__(self, var=None):
        self._var = var if var is not None else []
        print 'var = %s %s' % (var, id(var))
  

関数定義内の空のリストは、関数自体が作成されるときに一度作成されます。関数が呼び出されるたびに作成されるわけではありません。

その通り。この問題を回避するには、関数定義でNoneを割り当て、関数本体でNoneを確認します。

class A(object):
    def __init__(self, var=None):
        if var is None:
            var = []
        self._var = var
        print 'var = %s %s' % (var, id(var))
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top