为什么如下:

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 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))
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top