Pythonでのキーワード引数の初期化
-
05-07-2019 - |
質問
次の理由:
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))
所属していません StackOverflow