python 函数的缺省参数使用注意事项分析


Posted in Python onSeptember 17, 2019

本文实例讲述了python 函数的缺省参数使用注意事项。分享给大家供大家参考,具体如下:

python的函数支持4种形式的参数:分别是必选参数、 缺省参数、 可变长参数、关键字参数;而且参数的书写顺序也是又一定规定的,顺序如下

def fun(param, default_params, arbitrary_params, keyword_param)

下面针对缺省型参数分析一些注意事项

先定义这样子一个函数

def test_fun(a=[]):
   a.append('a')
   print a
if __name__ == '__main__':
  test_fun()
  test_fun()

按我们定义函数的意愿,觉得应该打印的结果是:

['a']
['a']

然而真实的结果是

['a']
['a', 'a']

为什么结果会叠加呢,问题出在缺省值上

但我们给一个函数定义一些缺省的参数时,在调用该函数的时候, 实际上是先定义了一个对象, 但是只有第一次调用的时候,才是定义, 而之后的调用, 都是指向同一个变量

所以在第一次调用test_fun()时, 定义了一个[], 而且这个[]在逻辑上是和这个函数绑定的, 而第二次调用test_fun时, 不再定义, 而是直接引用第一次定义的那个缺省对象,所以第二次打印的结果会叠加第一次的

为了避免这种不合乎我们原来意图的调用和实现,在构造缺省参数时, 我们最好构造一个不可变对象, ([]是可变对象), 以防止该缺省对象给表动而导致第二次调用时,缺省值不是我们的最初的值了

那现在再定义函数

def test_fun_1(a=[]):
   a.append('a')
   print a
def test_fun_2(a=[]):
  a.append('a')
  print a
if __name__ == '__main__':
  test_fun_1()
  test_fun_1()
  test_fun_2()
  test_fun_2()

结果会是:

['a']
['a', 'a']
['a']
['a', 'a']

为什么test_fun_1 和 test_fun_2的对象没有相互叠加呢, 因为缺省对象实际和函数是绑定的, 也就是test_fun_1的缺省值[] 和test_fun_2的缺省值[] 是两个不相干的对象

关于Python相关内容感兴趣的读者可查看本站专题:《Python函数使用技巧总结》、《Python面向对象程序设计入门与进阶教程》、《Python数据结构与算法教程》、《Python字符串操作技巧汇总》、《Python编码操作技巧总结》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python的Flask框架中实现登录用户的个人资料和头像的教程
Apr 20 Python
python创建列表并给列表赋初始值的方法
Jul 28 Python
Python对字符串实现去重操作的方法示例
Aug 11 Python
python自动化脚本安装指定版本python环境详解
Sep 14 Python
OPENCV去除小连通区域,去除孔洞的实例讲解
Jun 21 Python
python多进程实现文件下载传输功能
Jul 28 Python
深入浅析Python获取对象信息的函数type()、isinstance()、dir()
Sep 17 Python
postman传递当前时间戳实例详解
Sep 14 Python
Python Lambda函数使用总结详解
Dec 11 Python
Python @property原理解析和用法实例
Feb 11 Python
用Python制作灯光秀短视频的思路详解
Apr 13 Python
pytorch model.cuda()花费时间很长的解决
Jun 01 Python
Python 字符串、列表、元组的截取与切片操作示例
Sep 17 #Python
Python 实现大整数乘法算法的示例代码
Sep 17 #Python
Python对接 xray 和微信实现自动告警
Sep 17 #Python
Python计算两个矩形重合面积代码实例
Sep 16 #Python
详解Python3 pickle模块用法
Sep 16 #Python
python scipy卷积运算的实现方法
Sep 16 #Python
python 三元运算符使用解析
Sep 16 #Python
You might like
php录入页面中动态从数据库中提取数据的实现
2006/10/09 PHP
php下图片文字混合水印与缩略图实现代码
2009/12/11 PHP
PHP使用CURL实现对带有验证码的网站进行模拟登录的方法
2014/07/23 PHP
PHP利用hash冲突漏洞进行DDoS攻击的方法分析
2015/03/26 PHP
浅谈PHP中JSON数据操作
2015/07/01 PHP
记Laravel调用Gin接口调用formData上传文件的实现方法
2019/12/12 PHP
一个JavaScript继承的实现
2006/10/24 Javascript
用jscript实现列出安装的软件列表
2007/06/18 Javascript
一个JS翻页效果
2007/07/23 Javascript
jquery 插件开发方法小结
2009/10/23 Javascript
jQuery 美元符冲突的解决方法
2010/03/28 Javascript
JS DOM 操作实现代码
2010/08/01 Javascript
js 自动播放的实例代码
2013/11/19 Javascript
node.js中的fs.close方法使用说明
2014/12/17 Javascript
JavaScript使用push方法添加一个元素到数组末尾用法实例
2015/04/06 Javascript
使用jQuery+EasyUI实现CheckBoxTree的级联选中特效
2015/12/06 Javascript
jQuery实现表单动态添加与删除数据操作示例
2018/07/03 jQuery
原生js实现的移动端可拖动进度条插件功能详解
2019/08/15 Javascript
解决vue中axios设置超时(超过5分钟)没反应的问题
2020/09/04 Javascript
[02:59]2014DOTA2西雅图国际邀请赛 圆满落幕中国夺冠
2014/07/23 DOTA
Python基于FTP模块实现ftp文件上传操作示例
2018/04/23 Python
pandas数据处理基础之筛选指定行或者指定列的数据
2018/05/03 Python
python format 格式化输出方法
2018/07/16 Python
Python requests模块实例用法
2019/02/11 Python
python把ipynb文件转换成pdf文件过程详解
2019/07/09 Python
Django中celery执行任务结果的保存方法
2019/07/12 Python
Python描述符descriptor使用原理解析
2020/03/21 Python
python递归函数用法详解
2020/10/26 Python
KIKO比利时官网:意大利彩妆品牌
2017/07/23 全球购物
Bose法国官网:购买耳机、扬声器、家庭影院、专业音响
2017/12/21 全球购物
对象的序列化(serialization)类是面向流的,应如何将对象写入到随机存取文件中
2015/06/22 面试题
采购内勤岗位职责
2013/12/10 职场文书
应用艺术专业个人的自我评价
2014/01/03 职场文书
工程售后服务承诺书
2014/05/21 职场文书
合作合同协议书范本
2015/01/27 职场文书
python中super()函数的理解与基本使用
2021/08/30 Python