做Python中的一道选择题,想不明白,大神们给看看,给我解个惑
def func(x = [],y = [6,7]):
x.append(8)
y.append(8)
return(x + y)
a,b = [1,2],[3,4]
t = func(x = a)
t = func(y = b)
print(func(),end = ';')
运行结果:[8, 8, 6, 7, 8, 8];
我的结果(想的)[8, 8, 6, 7, 8];
用Pycharm debug 也没看明白
最后那个print(func(),end = ';') 执行后 函数里的y 为什么等于[6,7,8]?
这是Python中很常见的一个坑,这里涉及的一个知识点是Python函数参数的默认值是静态的。换句话说当python解析到def func(x = [],y = [6,7]):
这句时就会在静态数据区创建默认值[]和[6, 7]。
当你调用t = func(x = a)
时,y没有传参因此会使用默认值,因此执行后静态区的默认值变为[], [6,7,8]
当你调用t = func(y = b)
时,x没有传参因此会使用默认值,因此执行后静态区的默认值变为[8], [6,7,8]
最后当调用func()
时,x,y都没有传参因此都会使用默认值,此时默认值为[8], [6,7,8],所以最后的结果是[8, 8] + [6, 7, 8, 8],最终为[8, 8, 6, 7, 8, 8]
因此函数默认参数尽量不要用可变集合类型,用可变集合类型做参数会有很多潜在的问题,我都整理在这篇文章里,你可以参考一下: