Python中list作为默认参数的陷阱
Posted Bil369
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python中list作为默认参数的陷阱相关的知识,希望对你有一定的参考价值。
在Python中,作为默认参数的一定要是不可变对象,如果是可变对象,就会出现问题,稍不注意,就会调入陷阱,尤其是初学者,比如我(┬_┬)。
我们来看一个例子。
1 def add(L=[]): 2 L.append(1) 3 return L 4 5 L = [1, 2, 3] 6 newL = add(L) 7 print(newL) 8 newL = add(newL) 9 print(newL) 10 11 testL = add() 12 print(testL) 13 testL = add() 14 print(testL) 15 testL = add() 16 print(testL)
运行结果如图:
在正常传入参数的时候,好像没什么大问题。但是当我们使用默认参数的时候,问题出现了。
运行结果没有按我们的预期出现。原因何在?
当我们调用函数时,如果有传递参数,则使用传递的参数,如果没有传递参数,就使用默认参数。而使用默认参数的时候,使用的是同一个,也就是保存的上一个默认参数值。我们可以通过打印id来验证一下。
因此,默认参数一定要是不可变对象,如果是可变对象的话,就会出现上述情况。
那么如何解决呢?
我们可以让L先指向None这个不可变变量,然后增加一个判断,让默认参数重新归位即可。
1 def add(L=None): 2 if(L == None): 3 L = [] 4 L.append(1) 5 return L 6 7 L = [1, 2, 3] 8 newL = add(L) 9 print(newL) 10 newL = add(newL) 11 print(newL) 12 13 testL = add() 14 print(testL) 15 testL = add() 16 print(testL) 17 testL = add() 18 print(testL)
这样子,我们就解决了这个陷阱,那么下次就不应该再掉进去了,你说是不是?
牢记:默认参数要使用不可变对象!!!
不可变(immutable):int、string、float、number、tuple
可变(mutable):dictionary、list、set
以上是关于Python中list作为默认参数的陷阱的主要内容,如果未能解决你的问题,请参考以下文章