将列表作为函数的默认参数是python的一个坑。简单来说就是在第一次使用默认列表参数时,会创建一个默认值,并且只会创建这一次,修改会在这个基础上,之后如果是正常调用,赋值的话没有问题,但是如果使用默认参数,就会再之前修改完的基础上进行。
x:第一次就是我们通常的赋值,最后的结果也是正常的,第二次使用了x的默认参数,这时候创建了一个默认参数[],这个默认值只会被创建一次(在第一次使用默认参数时),然后append(8),此时的默认值就是[8],当函数再次被调用时,x的默认值是[8]而不是[],因为x只被创建一次。因此一次运算最后是在[8]的基础上进行的,因此最后x=[8,8]。
y:第一次运算就使用了默认参数,此时y=[6,7],在append(8)之后,y的默认参数变成了[6,7,8],第二次使用了赋值和默认参数无关,第三次是在y=[6,7,8]的基础上进行运算的。
你可以打印一下id来看一下。
def func(x=[],y=[6,7]):
print(id(x))
print('x0:',x)
print('y0:',y)
x.append(8)
y.append(8)
print('x1:',x)
print('y1:',y)
return(x+y)
a,b=[1,2],[3,4]
t=func(x=a)
print(t)
t=func(y=b)
print(t)
t=func()
print(t)
输出:
2246837421056
x0: [1, 2]
y0: [6, 7]
x1: [1, 2, 8]
y1: [6, 7, 8]
[1, 2, 8, 6, 7, 8]
2246837401984
x0: []
y0: [3, 4]
x1: [8]
y1: [3, 4, 8]
[8, 3, 4, 8]
2246837401984
x0: [8]
y0: [6, 7, 8]
x1: [8, 8]
y1: [6, 7, 8, 8]
[8, 8, 6, 7, 8, 8]