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

posted @ 2018-08-16 17:00  IMWU  阅读(212)  评论(0编辑  收藏  举报