0

为什么会出现以下情况:

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

我不明白为什么在使用可选关键字参数时它不使用列表的新实例,谁能解释一下?

4

3 回答 3

6

函数定义中的空列表在创建函数本身时创建一次。它不是在每次调用函数时都创建的。

如果您每次都想要一个新的,请执行以下操作:

class A(object):
    def __init__(self, var=None):
        if var is None:
            var = []
        self._var = var
于 2009-05-05T13:51:21.267 回答
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))
于 2009-05-05T13:52:56.100 回答
1

函数定义中的空列表在创建函数本身时创建一次。它不是在每次调用函数时都创建的。

确切地。要解决此问题,请在函数定义中分配 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))
于 2009-05-05T13:55:20.663 回答