def func(x=[],y=[6,7]):
print('x:',x)
print('y:',y)
x.append(8)
y.append(8)
print('x:',x)
print('y:',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)
如题,为什么最后一步的输出结果是[8,8,6,7,8,8]
x=a和y=b为什么没有使[1,2]和[3,4]传入呢
将列表作为函数的默认参数是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]
因为func(x=[],y=[6,7])的参数x,y的默认值其实也是一个变量,你调用t=func(x=a)和t=func(y=b)已经改变了参数x,y的默认值,所以最后一次调用会出现这个情况
因为python函数参数的默认值是在创建函数时就生成了的,并保存在函数内部,而不是调用函数时再生成。
当第一次调用函数对默认值的列表添加了内容,下一次再调用函数时默认值的列表还是上次添加了内容的那个,而不是再生成一个新的列表。
这种情况对于不可变类型的值没什么影响,但对于列表这样可变类型的值就要注意了。
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632