Python小坑—可变参数默认导致调用共享问题
Python小坑—可变参数默认导致调用共享问题

Python小坑—可变参数默认导致调用共享问题

很抽象的小坑,所有可变对象作为默认参数,都会出现这个问题。背后的本质是可变对象只是一个引用,而不是具体的值。

我们一般默认是每次调用函数应该是重新新建一个空列表,但是实际上,它只会在函数定义的那一刻创建一次这个列表。然后所有的调用都是使用这一个列表。

def func(a,b=[]):  
    b.append(a)  
    return b

print(func(1))
[1]
print(func(2))
[1, 2]
print(func(3))
[1, 2, 3]

解决方案也很简单,就是使用None,也就是将可变对象的定义放到函数内部,这样就避免了此类问题。

def func2(a,b=None):
    if b == None:
        b=[]
    b.append(a)
    return b

print(func2(1))
[1]
print(func2(2))
[2]
print(func2(3))
[3]
print(func2(1,[1]))
[1, 1]

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注