Python中的默认参数实例分析


Posted in Python onJanuary 29, 2018

本文研究的主要是Python中的默认参数的相关内容,具体如下。

熟悉C++语言的可以知道,C++语言中的默认参数是写在函数声明中的,为语法糖,与函数的调用无关,是在函数调用的时候由编译器补齐参数然后进行调用。

而Python中的默认参数与其有相当大的不一样,如下例中的代码执行结果会是什么呢?

def test_parameter(a, dfp=[]):
 dfp.append(a)
 print(dfp)

test_parameter(1)
test_parameter(2)
test_parameter(3)

从结果中可以看到其结果如下,与我们期望完全不一致:

[1]
[1, 2]
[1, 2, 3]

分析

为什么Python的默认参数是这样的表现,需要从Python的函数定义说起。Python中 def 实际上是可执行语句,执行 def 的时候会创建一个函数对象,而默认参数也会在执行 def 语句的时候计算出来并存在函数的_defaults_属性中。

def test_parameter(a, dfp=[]):
 dfp.append(a)
 print(id(dfp))

test_parameter(1)
test_parameter(2)
print(test_parameter.__defaults__)
print(id(test_parameter.__defaults__[0]))

结果如下,可见调用函数时使用的默认参数和_defaults_中的对象为同一对象:

140109485401224
140109485401224
([1, 2],)
140109485401224

使用

在明白上述原理后,可以知道以后在使用默认参数的时候需要注意,如果默认参数是可变对象则需要判断是否每次调用函数时是共享默认参数还是产生新对象。如果是新生成对象,常采用None作为默认参数占位,如果判断当前为None,则新建可变对象使用。

def test(a, dfp=None):
 if dfp is None:
  dfp = []
 pass #使用dfp

总结

以上就是本文关于Python中的默认参数实例分析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
快速入手Python字符编码
Aug 03 Python
shell命令行,一键创建 python 模板文件脚本方法
Mar 20 Python
python线程池threadpool使用篇
Apr 27 Python
Python3内置模块random随机方法小结
Jul 13 Python
python调用其他文件函数或类的示例
Jul 16 Python
PyCharm2019安装教程及其使用(图文教程)
Sep 29 Python
wxPython多个窗口的基本结构
Nov 19 Python
Python开发之身份证验证库id_validator验证身份证号合法性及根据身份证号返回住址年龄等信息
Mar 20 Python
Python基于stuck实现scoket文件传输
Apr 02 Python
如何通过Python3和ssl实现加密通信功能
May 09 Python
Pandas读取csv时如何设置列名
Jun 02 Python
python数字图像处理之对比度与亮度调整示例
Jun 28 Python
Python使用遗传算法解决最大流问题
Jan 29 #Python
Python subprocess模块详细解读
Jan 29 #Python
python微信跳一跳游戏辅助代码解析
Jan 29 #Python
Python面向对象之继承代码详解
Jan 29 #Python
Python多线程threading和multiprocessing模块实例解析
Jan 29 #Python
Python编程scoketServer实现多线程同步实例代码
Jan 29 #Python
Python模块搜索路径代码详解
Jan 29 #Python
You might like
《星际争霸重制版》兵种对比图鉴
2020/03/02 星际争霸
php缓存技术介绍
2006/11/25 PHP
PHP array_push 数组函数
2009/12/26 PHP
mysql From_unixtime及UNIX_TIMESTAMP及DATE_FORMAT日期函数
2010/03/21 PHP
PHP7.1实现的AES与RSA加密操作示例
2018/06/15 PHP
JavaScript 学习笔记(五)
2009/12/31 Javascript
FileUpload 控件 禁止手动输入或粘贴的实现代码
2010/04/07 Javascript
JS 类型转换常见方法小结
2010/05/31 Javascript
javascript包装对象实例分析
2015/03/27 Javascript
jQuery使用hide方法隐藏元素自身用法实例
2015/03/30 Javascript
JS动态显示表格上下frame的方法
2015/03/31 Javascript
JS+CSS简单树形菜单实现方法
2015/09/12 Javascript
AngularJs 弹出模态框(model)
2016/04/07 Javascript
后端接收不到AngularJs中$http.post发送的数据原因分析及解决办法
2016/07/05 Javascript
全面了解JavaScript对象进阶
2016/07/19 Javascript
Jquery鼠标放上去显示全名的实现方法
2017/02/06 Javascript
Node.js如何使用Diffie-Hellman密钥交换算法详解
2017/09/05 Javascript
nodejs中方法和模块用法示例
2018/12/24 NodeJs
js中对象与对象创建方法的各种方法
2019/02/27 Javascript
详解vue-element Tree树形控件填坑路
2019/03/26 Javascript
Layui表格行工具事件与数据回填方法
2019/09/13 Javascript
Egg Vue SSR 服务端渲染数据请求与asyncData
2019/11/24 Javascript
解决idea开发遇到javascript动态添加html元素时中文乱码的问题
2020/09/29 Javascript
Python中操作符重载用法分析
2016/04/29 Python
python利用正则表达式提取字符串
2016/12/08 Python
Python Subprocess模块原理及实例
2019/08/26 Python
利用css3制作3D样式按钮实现代码
2013/03/18 HTML / CSS
荷兰在线啤酒店:Beerwulf
2019/08/26 全球购物
帮一个朋友写的求职信
2014/08/09 职场文书
大一新生期末自我评价
2014/09/12 职场文书
护士年终个人总结
2015/02/13 职场文书
公司财务经理岗位职责
2015/04/08 职场文书
寻找最美乡村教师观后感
2015/06/18 职场文书
2015年公司中秋节致辞
2015/07/31 职场文书
导游词之徐州-云龙山
2019/09/29 职场文书
Spring Boot 启动、停止、重启、状态脚本
2021/06/26 Java/Android