为何Python构造方法的默认列表参数未每次初始化为空?
Python可变默认参数的常见陷阱
先看你的代码:
class Foo: def __init__(self, args = []): print(args) self.data = args for _ in range(2): foo = Foo() foo.data.append(True)
实际输出是:
[] [True]
这是因为Python函数的默认参数是在函数定义阶段就初始化完成的,而不是每次调用函数时重新创建。这里args=[]的空列表,在你定义Foo.__init__方法的时候就已经生成了一个具体的列表对象,每次调用Foo()且不传入args参数时,都会复用这个同一个列表对象。
第一次调用Foo()时,这个默认列表是空的,所以打印[],之后foo.data指向这个列表,执行append(True)后,列表内容变成[True]。第二次调用Foo()时,依然使用这个已经被修改过的列表作为默认值,所以打印[True],如果继续循环,列表还会持续被修改。
要解决这个问题,正确的写法是把默认参数设为None,然后在函数内部创建新的空列表:
class Foo: def __init__(self, args=None): # 当没有传入args时,新建一个空列表 if args is None: args = [] print(args) self.data = args for _ in range(2): foo = Foo() foo.data.append(True)
这样每次调用Foo()时,都会生成一个全新的空列表,两次输出都会是[],每个实例的data也都是独立的。
内容的提问来源于stack exchange,提问作者user2011659
相关产品推荐
相关产品推荐

