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使用beautifulsoup从爱奇艺网抓取视频播放
Jan 23 Python
常用python数据类型转换函数总结
Mar 11 Python
Python创建文件和追加文件内容实例
Oct 21 Python
Python中函数的参数传递与可变长参数介绍
Jun 30 Python
Python字符串匹配算法KMP实例
Jul 18 Python
[原创]pip和pygal的安装实例教程
Dec 07 Python
python thrift搭建服务端和客户端测试程序
Jan 17 Python
小白如何入门Python? 制作一个网站为例
Mar 06 Python
Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
Aug 05 Python
python正则表达式匹配IP代码实例
Dec 28 Python
Python验证码截取识别代码实例
May 16 Python
Vs Code中8个好用的python 扩展插件
Oct 12 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获取163、gmail、126等邮箱联系人地址【已测试2009.10.10】
2009/10/11 PHP
php更改目录及子目录下所有的文件后缀的代码
2010/09/24 PHP
php cli模式学习(PHP命令行模式)
2013/06/03 PHP
ThinkPHP多表联合查询的常用方法
2020/03/24 PHP
php中file_get_contents与curl性能比较分析
2014/11/08 PHP
用php来限制每个ip每天浏览页面数量的实现思路
2015/02/24 PHP
基于命令行执行带参数的php脚本并取得参数的方法
2016/01/25 PHP
Yii框架通过请求组件处理get,post请求的方法分析
2019/09/03 PHP
PHP vsprintf()函数格式化字符串操作原理解析
2020/07/14 PHP
基于jQuery的js分页代码
2010/06/10 Javascript
使用js显示当前时间示例
2014/03/02 Javascript
JavaScript中的some()方法使用详解
2015/06/09 Javascript
纯js模拟div层弹性运动的方法
2015/07/27 Javascript
使用Javascript写的2048小游戏
2015/11/25 Javascript
详解JavaScript中this关键字的用法
2016/05/26 Javascript
js数组操作方法总结(必看篇)
2016/11/22 Javascript
微信小程序 MD5加密登录密码详解及实例代码
2017/01/12 Javascript
浅谈vue+webpack项目调试方法步骤
2017/09/11 Javascript
vue使用axios实现文件上传进度的实时更新详解
2017/12/20 Javascript
详解Angular6学习笔记之主从组件
2018/09/05 Javascript
详解jQuery设置内容和属性
2019/04/11 jQuery
localstorage实现带过期时间的缓存功能
2019/06/28 Javascript
基于Python实现通过微信搜索功能查看谁把你删除了
2016/01/27 Python
python 爬取微信文章
2016/01/30 Python
python如何删除文件中重复的字段
2019/07/16 Python
python3.7将代码打包成exe程序并添加图标的方法
2019/10/11 Python
python实现五子棋游戏(pygame版)
2020/01/19 Python
Python Numpy,mask图像的生成详解
2020/02/19 Python
路由表示做什么用的?在linux环境中怎么来配置一条默认路由?
2013/06/07 面试题
办公自动化毕业生求职信
2014/03/09 职场文书
企业优秀员工事迹材料
2014/05/28 职场文书
环境卫生倡议书
2014/08/29 职场文书
JVM之方法返回地址详解
2022/02/28 Java/Android
SQL CASE 表达式的具体使用
2022/03/21 SQL Server
Vue操作Storage本地化存储
2022/04/29 Vue.js
Go结合Gin导出Mysql数据到Excel表格
2022/08/05 Golang