默认参数的坑

定义一个函数,传入一个list,添加一个end再返回

def  add_end(L=[]):L.append('END')return L

正常调用时,结果似乎不错

print  add_end([1,2,3])  #[1, 2, 3, 'END']

使用默认参数调用时,一开始结果也是对的,但是再次调用时,结果就不对了

print add_end()   #['END']print add_end()    #['END', 'END']print  add_end()    #['END', 'END', 'END']

从上述调用结果发现,函数每次都记住了上次添加了‘END’后的list,python函数在定义的时候,默认参数L的值就被计算出来了即[],因为默认参数L也是一个变量,它指向对象[],每次调用该函数,如果改变 了L的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]了

所以,定义默认参数要牢记一点:默认参数必须指向不变对象

修改上面的例子,可以用None这个不变对象来实现

def  add_end2(L=None):if L is None:L=[]L.append('END')return  L

无论调用多少次都没问题

print add_end2()
print  add_end2()
print  add_end2()
#['END']
#['END']
#['END']

不变对象一旦创建,对象内部的数据就不能修改,这样就减少了由于修改数据导致的错误。此外,由于对象不变,多任务环境下同时读取对象不需要加锁,同时读一点问题都没有。我们在编写程序时,如果可以设计一个不变对象,那就尽量设计成不变对象。

不可变(immutable):int、字符串(string)、float、(数值型number)、元组(tuple)
可变(mutable):字典型(dictionary)、列表型(list)

转载于:https://www.cnblogs.com/zwgblog/p/7194950.html

Python默认参数的坑相关推荐

  1. python 默认参数_避坑指南!Python里面的这九个坑,坑的就是你!

    Python里面有一些坑,让你防不胜防,菜鸟经常会弄晕,而学习多年的Python老鸟也会时不时中招.小编整理了9个坑,都是会经常碰到的坑,让你大呼我曾经也碰到过! 虽然是小的问题,但是在实际的项目中, ...

  2. Python默认参数

    Python | 默认参数 (Python | default parameters) A default parameter is a value provided in a function de ...

  3. python默认参数举例_Python之在函数中使用列表作为默认参数

    本文将介绍笔者在工作中遇到的Python的一个坑,那就是使用列表作为默认参数. 我们知道,在Python中,列表(list)是可变对象,所以列表的内容可能会在函数内改变.另一个需要注意的是,使用列表作 ...

  4. python默认参数只被解释一次_深入讲解Python函数中参数的使用及默认参数的陷阱...

    C++里函数可以设置缺省参数,Java不可以,只能通过重载的方式来实现,python里也可以设置默认参数,最大的好处就是降低函数难度,函数的定义只有一个,并且python是动态语言,在同一名称空间里不 ...

  5. python默认参数 可变对象_当心Python函数可变默认参数(list,set,dict…)的陷阱

    绝大多数情况下,Python是一个干净具有一致性的语言.然而,有些少数情况会让初学者感到困惑.其中有些情况是有意识的但会成为潜在的莫名其妙,而有些可以说是语言赘肉.下面我们看看使用可变默认参数(Mut ...

  6. python默认参数举例_Python中的默认参数实例分析

    本文研究的主要是Python中的默认参数的相关内容,具体如下. 熟悉C++语言的可以知道,C++语言中的默认参数是写在函数声明中的,为语法糖,与函数的调用无关,是在函数调用的时候由编译器补齐参数然后进 ...

  7. python 默认参数_有趣的 Python 特性 3 | 当心默认可变参数这个大猪蹄子。

    本文字数:1575 字 阅读本文大概需要:4 分钟 写在之前 Python 提供了很多让使用者觉得舒服至极的功能特性,但是随着不断的深入学习和使用 Python,我发现其中存在着许多玄学的输出与之前预 ...

  8. python默认参数陷阱_python默认参数陷阱

    0|1陷阱? 学过函数的人一定听说过函数的默认参数,关于函数的默认参数,请看以下的例子: def extendList(val, lst=[]): lst.append(val) return lst ...

  9. python默认参数不能定义为可变对象类型

    python的默认参数只会在函数定义时被确定,而不是每次调用时重新确定,所以,一旦在函数中修改了默认参数,则在随后的调用中都会生效 由于这个特性,在定义函数时,如果默认参数使用可变的对象类型,如空列表 ...

  10. python 默认参数后接可变参数_Python可变参数会自动填充前面的默认同名参数实例...

    Python可变参数会自动填充前面的默认同名参数实例 最近在学习Python的时候遇到一个知识点,在此记录下来 可变参数会自动填充前面的同名默认参数 比如下面这个函数 def add_student( ...

最新文章

  1. 卷积神经网络 卷积的概念
  2. lintcode:最小编辑距离
  3. Python 最强编辑器PyCharm详细使用指南!
  4. 云桌面三大谎言之GPU虚拟化
  5. libcurl代码示例
  6. css 垂直居中_当面试官问起CSS布局之水平垂直居中时~~
  7. 如何用maven创建java项目_Maven创建Java项目
  8. 10HTML5期末大作业:影视在线网站设计——电影网H5(9页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码
  9. 一个平凡但不平庸的程序猿2018个人总结
  10. CARBON X1 安装 chrome os
  11. python eml解析_如何在python中读取eml文件?
  12. P1359 租用游艇【Floyd】
  13. RSF 分布式服务框架设计:线程模型
  14. 医学影像组学之数据增强免费教程
  15. day2——泰波那契数列
  16. C语言经典例题100道(求素数最全的方法在这里!!!)
  17. OPC配置客户端和服务端
  18. 实体词典 情感词典_基于词典的文本情感分析(附代码)
  19. 博弈论算法Java,博弈论-java-51CTO博客
  20. 红米K30PRO线刷稳定版中途错误

热门文章

  1. Servlet开发(1)-----基础及MVC设计模式
  2. 中年男人的唯一出路就是安分守己
  3. HTML5 浏览器返回按钮/手机返回按钮事件监听
  4. 2011 5月13日
  5. 3.2 语音识别概述
  6. SAMBA服务和FTP/sshd 服务讲解
  7. http之url和uri
  8. Python-Day2三级菜单
  9. Vue中全局导入和按需导入的区别
  10. 蓝桥练习 之 单词个数统计