Python中的函数的参数传入怎么理解(多次重复自定义函数后参数的变化)?

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