Python函数默认参数引发的问题
Python函数默认参数引发的问题
当你定义如下函数时:
def f(a, L=[]):
L.append(a)
return L
尝试输出:
print(f(1))
print(f(2))
print(f(3))
你可能期望输出:
[1]
[2]
[3]
实际将输出:
[1]
[1, 2]
[1, 2, 3]
为什么会这样?
查阅资料后得到如下解释:
Python函数的参数默认值,是在编译阶段就绑定的
要想理解这段话首先需要了解Python变量的实质:
Python中的变量实际上是对值或者对象的一个指针
如果参数的默认值是一个不可变对象,那么函数体内如果修改了该参数,那么参数就会重新指向另一个新的不可变值。
即 a=1 #创建对象1,a指向1对象
a=2 #创建新对象2,a指向2对象
如果参数的默认值是可变对象,那么函数体内修改了该参数,实际上是对编译阶段确定的那个可变对象进行修改。
即 a=[] #a指向[]对象
a=[1] #a指向不变,[]对象修改为[1]
Python的设计最终导致了最上面看到的累积效果
要想避免,可以这么做:
def f(a, L=None): #用不可变对象做默认参数
if L is None:
L = []
L.append(a)
return L
参考资料:https://www.jb51.net/article/63055.htm