不要用可变类型对象做函数默认参数

1. 可变对象做默认参数

内置数据类型int,float,bool,str,tuple 是不可变对象, 字典,集合,列表是可变对象。

在定义python函数时,千万不要使用可变类型对象作为函数的默认参数,那样会引发意想不到的错误,下面的代码向你展示这种错误

def add_int(value, data=[]):

data.append(value)

return data

result = add_int(3)

print(result) # [3]

我定义了一个add_int函数,默认参数data是一个列表,程序执行结果是[3], 看起来没有什么问题,但是在第2次执行add_int函数时,就会出现意想不到的情况

def add_int(value, data=[]):

data.append(value)

return data

result = add_int(3)

print(result)

result = add_int(4)

print(result)

程序输出结果是

[3]

[3, 4]

第2次输出的结果并不是预期的[4], 而是包含了第一次调用函数add_int函数时传入的参数3,这究竟是怎么一回事呢?

2. 函数默认参数

在定义函数时,默认参数只会被计算一次,而不是每次调用函数的时候才计算。python脚本在执行过程中,遇到函数定义的代码,会进行编译,创建一个代码对象,完成编译后,python会将默认参数存储在函数对象之中,准确的说是存储在__defaults__属性中,此后每次调用函数所使用的默认参数都是最开始计算的那一个,而由于这个默认参数是可变对象,所以会导致上面所描述的诡异问题。

def add_int(value, data=[]):

data.append(value)

return data

print(add_int.__defaults__)

通过输出__defaults__, 我们可以参看函数的默认参数,程序输出结果是一个元组([],) , 刚刚定义完的函数里,默认参数data还是一个空列表,执行过一次以后,就发生变化了

def add_int(value, data=[]):

data.append(value)

return data

print(add_int.__defaults__)

add_int(3)

print(add_int.__defaults__)

程序输出结果

([],)

([3],)

python可变类型与不可变类型作为函数参数区别_不要用可变类型对象做函数默认参数...相关推荐

  1. 洗礼灵魂,修炼python(21)--自定义函数(2)—函数文档,doctest模块,形参,实参,默认参数,关键字参数,收集参数,位置参数...

    函数文档 1.什么是函数文档: 就是放在函数体之前的一段说明,其本身是一段字符串,一个完整的函数需要带有函数文档,这样利于他人阅读,方便理解此函数的作用,能做什么运算 2.怎么查看函数文档: func ...

  2. python中协程与函数的区别_深入浅析python 协程与go协程的区别

    进程.线程和协程 进程的定义: 进程,是计算机中已运行程序的实体.程序本身只是指令.数据及其组织形式的描述,进程才是程序的真正运行实例. 线程的定义: 操作系统能够进行运算调度的最小单位.它被包含在进 ...

  3. 可变悬挂与空气悬挂的区别_空气悬挂和可变悬架是同样功能吗?

    汽车之家这个配置分类栏确实容易把普通消费者绕进去,如果不是因为干这一行,我也会分不清.一旦理解,就没问题了,其实这个表格还算是比较严谨. 首先拿汽车之家里库里南的参数表为例解释几个名词概念见上图.表里 ...

  4. python数组和函数的区别_真假美猴王-Numpy数据与Python数组的区别与联系!

    Numpy,是python中的一个矩阵计算包,功能类似matlab的矩阵计算.Numpy的诞生弥补了下面提到的两项的不足,numpy提供了两种基本的对象:ndarray(N-dimensional a ...

  5. python中变量和函数的区别_关于python中带下划线的变量和函数 的意义

    Python 的代码风格由 PEP 8 描述.这个文档描述了 Python 编程风格的方方面面.在遵守这个文档的条件下,不同程序员编写的 Python 代码可以保持最大程度的相似风格.这样就易于阅读, ...

  6. python对象不接受参数什么意思_python的类和对象2(self参数)

    python的类和对象2(self参数) 1.python里面对象的方法都会有self参数,它就相当于C++里面的this指针:绑定方法,据说有了这个参数,Python 再也不会傻傻分不清是哪个对象在 ...

  7. python搭建微信小程序卖货要收费用吗_个人的微信小程序做店铺收费吗?要收多少...

    微信小程序受到了广大用户的使用和喜爱,这种不用下载的应用,让人们能更快的开启和关闭应用,不用担心自己的内存不够.那么今天我们来了解下,个人的微信小程序做店铺收费吗?要收多少? 现在许多用了许多小程序了 ...

  8. python求某个函数的反函数_如何用sympy求快速sigmoid函数的逆函数?

    这似乎是SymPy 1.4版中的一个bug.在master上,我没有得到例外,而是得到:In [2]: solve(lower + (upper - lower) * (0.5 + 0.5 * x / ...

  9. python可变参数和关键字参数位置_python的位置参数、默认参数、关键字参数、可变参数区别...

    一.位置参数 调用函数时根据函数定义的参数位置来传递参数. #!/usr/bin/env python # coding=utf-8def print_hello(name, sex): sex_di ...

最新文章

  1. Linux如何实现断点续传文件功能?
  2. 放在NSArray、NSDictionary等容器内的对象Item,Item中的property在程序运行过程中被无故释放...
  3. 注定一爆就完的ZAO ,为什么只是一剂社交毒药?
  4. g11 android 4.4,HTC G11 Incredible S 稳定流畅Android4.0.4华丽体验Sense4.1 省电耐用
  5. map容器中删除一个元素(value)
  6. java 设置系统参数_Java如何设置系统参数和运行参数
  7. 前端学习(1316):静态资源
  8. php文件的作用,php入口文件的作用-PHP问题
  9. 4、HTML 超链接
  10. python类与对象作业_荐富贵和你一起复习Python(第10篇)— 面向对象程序设计
  11. pythongui做计算器_python GUI模拟实现计算器
  12. Hive语言手册-ORC
  13. 一个工业相机通用类解决大部分业内流行相机的访问(基于大华相机的动态链接库开发的通用相机类)C#版
  14. mysql开启远程登录
  15. 法向量与切向量的转化
  16. 网络邻居计算机访问权限设置,网上邻居计算机拒绝访问
  17. 用了这么多年Redis,你知道Redis名字的由来吗?
  18. 运用 children 获取节点子元素解决文本节点阻碍
  19. MBE清新风格毕业答辩PPT模板
  20. 大规模病毒入侵,全靠分布式

热门文章

  1. 新蓝剑java_Ubuntu 8.10 编译安装飞鸽(IPMsg 0.9.6)
  2. linux oracle 删除为空的dbf,Linux上Oracle误删除一个没有用的dbf表空间文件
  3. c语言time.h时区不对,用C语言修改系统时区,发现一堆问题,请各位大侠不吝赐教。...
  4. php文本框输入内容过滤,为什么没能过滤掉文本框输入的所有反斜杠?
  5. codelite linux 安装,CodeLite + MinGW环境安装
  6. gamma校正_Log与Gamma校正视频
  7. 插入排序算法 java_排序算法实现-插入排序(Java版本)
  8. mysql 多进程配置_基于mysql_multi实现MySQL多实例多进程配置
  9. http accept字段有用吗_http协议(六)报文首部
  10. 学习笔记(05):MySQL数据库运维与管理-03-二进制日志配置管理演示