码迷,mamicode.com
首页 > 编程语言 > 详细

Python中list作为默认参数的陷阱

时间:2018-08-01 14:21:07      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:函数   入参   就会   16px   com   table   family   默认   style   

  在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作为默认参数的陷阱

标签:函数   入参   就会   16px   com   table   family   默认   style   

原文地址:https://www.cnblogs.com/Bil369/p/9400548.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!