为什么如下:
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
我不明白为什么在使用可选关键字参数时它没有使用列表的新实例,有人可以解释一下吗?
答案 0 :(得分:6)
在创建函数本身时,会创建一次函数定义中的空列表。每次调用函数时都不会创建它。
如果您想每次都换一个新的,请执行以下操作:
class A(object):
def __init__(self, var=None):
if var is None:
var = []
self._var = var
答案 1 :(得分:2)
这是完全错误的。您不能(有意义地)在函数声明中提供可变对象作为默认值。
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))
答案 2 :(得分:1)
在创建函数本身时,会创建一次函数定义中的空列表。每次调用函数时都不会创建它。
完全。要解决此问题,请在函数体中定义None int,并在函数体中检查None:
class A(object):
def __init__(self, var=None):
if var is None:
var = []
self._var = var
print 'var = %s %s' % (var, id(var))