编译器为visual code
def asd(L=[]):
L.append('END')
return L
asd()
asd()
print(asd())
#输出为 ['END', 'END', 'END']def asf(K=[]):
K.append('END')
return K
asf(['2','4'])
asf(['2','4'])
print(asf(['2,','4']))
#输出为 ['2,', '4', 'END']先看第一段
def asd(L=[]): #先定义一个函数,传入一个list
L.append('END') #添加一个END
return L #返回
asd() #第一次调用
asd() #第二次调用
print(asd()) #输出第三次调用的内容,print的()中asd()实际是第三次调用
#输出为 ['END', 'END', 'END']第一次调用时结果为
['END']第二次调用时结果为
['END','END']第二段为L赋值后调用(不是默认参数,赋值了)
def asf(K=[]):
K.append('END')
return K
asf(['2','4'])
asf(['2','4'])
print(asf(['2,','4']))
#输出为 ['2,', '4', 'END']所以结果 ['2,', '4', 'END']在定义asd()的时候,默认参数L的值已经有了,即 []。而 L也是一个变量,它指向对象[],每次调用该函数时,如果改变L的值,则下次调用时,默认参数的值就变了,就不再是函数定义时的[]了。
为了结束这个问题,我们可以为L设置一个不变对象null来解决
def asd(L=null): """
if L is null: 为L设置一个 null 这个不变对象
L=[]
L.append('END') """
return L
asd()
asd()
print(asd())
#输出为 ['END']这样,无论调用多少次,其结果都是一样的
设置不变对象后,对象内部的数据就不能更改了。所以就减少了由于数据的修改而导致的错误。
能设置成一个不变对象,就尽量设置不变对象,以免日后的bug。
Python函数默认参数陷阱
本文通过两个具体的Python函数示例,深入浅出地解析了使用可变对象作为函数默认参数时可能遇到的问题,并提出了解决方案。
8万+

被折叠的 条评论
为什么被折叠?



