编译器为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。