在Python中,作为默认参数的一定要是不可变对象,如果是可变对象,就会出现问题,稍不注意,就会调入陷阱,尤其是初学者,比如我(┬_┬)。

  我们来看一个例子。

 def add(L=[]):
L.append(1)
return L L = [1, 2, 3]
newL = add(L)
print(newL)
newL = add(newL)
print(newL) testL = add()
print(testL)
testL = add()
print(testL)
testL = add()
print(testL)

  运行结果如图:

  

  在正常传入参数的时候,好像没什么大问题。但是当我们使用默认参数的时候,问题出现了。

  运行结果没有按我们的预期出现。原因何在?

  当我们调用函数时,如果有传递参数,则使用传递的参数,如果没有传递参数,就使用默认参数。而使用默认参数的时候,使用的是同一个,也就是保存的上一个默认参数值。我们可以通过打印id来验证一下。

  

  因此,默认参数一定要是不可变对象,如果是可变对象的话,就会出现上述情况。

  那么如何解决呢?

  我们可以让L先指向None这个不可变变量,然后增加一个判断,让默认参数重新归位即可。

 def add(L=None):
if(L == None):
L = []
L.append(1)
return L L = [1, 2, 3]
newL = add(L)
print(newL)
newL = add(newL)
print(newL) testL = add()
print(testL)
testL = add()
print(testL)
testL = add()
print(testL)

  

  这样子,我们就解决了这个陷阱,那么下次就不应该再掉进去了,你说是不是?

  牢记:默认参数要使用不可变对象!!!

  不可变(immutable):int、string、float、number、tuple

  可变(mutable):dictionary、list、set

最新文章

  1. vertx verticle
  2. ROW_NUMBER() OVER() 用法
  3. Linux 服务器的网络配置 - 1. 查看 Linux 服务器的网络连接
  4. Mac eclipse找不到source的解决办法
  5. Oracle 数据库安装
  6. 七大查找算法(附C语言代码实现)
  7. C# STUDY
  8. QTabWidget and QTabBar.的文字的颜色设置,三种方法
  9. servlet与jsp
  10. 多个 (li) 标签如何获取获取选中的里面的某个特定值??
  11. 读书笔记《PHP与MySQL程序设计》一
  12. PLEC-交流电机系统+笔记
  13. Ubuntu14下安装svn仓库,以及权限配置
  14. Kerberos主从配置文档
  15. JQuery EasyUI 日期控件 怎样做到只显示年月,而不显示日
  16. 代码录播:jQueryMobile 实现一个简单的弹出框效果
  17. 20155305乔磊2016-2017-2《Java程序设计》第十周学习总结
  18. Android 多分辨率多屏幕适配
  19. [bootstrap]模态框总结
  20. 2017.4.12 开涛shiro教程-第十八章-并发登录人数控制

热门文章

  1. vscode 小笔记
  2. CF221C Circling Round Treasures
  3. poj2001Trie树模板
  4. bzoj 4817: [Sdoi2017]树点涂色 LCT+树链剖分+线段树
  5. 多版本Python共存时pip给指定版本的python安装package的方法
  6. GCC泛型宏
  7. Python-实现与metasploit交互并进行ms17_010攻击
  8. man syslog | col -b > syslog.txt
  9. C++之string类
  10. 网络编程之socket编程