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 相关文章推荐
pygame学习笔记(1):矩形、圆型画图实例
Apr 15 Python
编写Python脚本来获取mp3文件tag信息的教程
May 04 Python
浅谈Python中的可变对象和不可变对象
Jul 07 Python
Python进阶之全面解读高级特性之切片
Feb 19 Python
Python脚本按照当前日期创建多级目录
Mar 01 Python
Python3.0 实现决策树算法的流程
Aug 08 Python
Python使用random模块生成随机数操作实例详解
Sep 17 Python
PyTorch预训练的实现
Sep 18 Python
关于Python解包知识点总结
May 05 Python
python实现发送带附件的邮件代码分享
Sep 22 Python
python正则表达式re.search()的基本使用教程
May 21 Python
python 单机五子棋对战游戏
Apr 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
DC宇宙的第一个英雄,堪称动漫史鼻祖,如今成为美国文化的象征
2020/04/09 欧美动漫
php Smarty 字符比较代码
2011/02/27 PHP
php实现的获取网站备案信息查询代码(360)
2013/09/23 PHP
php中实现精确设置session过期时间的方法
2014/07/17 PHP
PHP中round()函数对浮点数进行四舍五入的方法
2014/11/19 PHP
php实现兼容2038年后Unix时间戳转换函数
2015/03/18 PHP
在js中判断checkboxlist(.net控件客户端id)是否有选中
2013/04/11 Javascript
JQUERY对单选框(radio)操作的小例子
2013/04/25 Javascript
控制页面按钮在后台执行期间不重复提交的JS方法
2013/06/24 Javascript
checkbox全选所涉及到的知识点介绍
2013/12/31 Javascript
JavaScript中setTimeout的那些事儿
2016/11/14 Javascript
JavaScript的数据类型转换原则(干货)
2018/03/15 Javascript
浅谈Angular HttpClient简单入门
2018/05/04 Javascript
React router动态加载组件之适配器模式的应用详解
2018/09/12 Javascript
ajaxfileupload.js实现上传文件功能
2019/04/19 Javascript
微信小程序防止多次点击跳转(函数节流)
2019/09/19 Javascript
Python模拟登录12306的方法
2014/12/30 Python
Python使用metaclass实现Singleton模式的方法
2015/05/05 Python
python机器学习之神经网络(一)
2017/12/20 Python
在Python中获取操作系统的进程信息
2019/08/27 Python
python随机模块random使用方法详解
2020/02/14 Python
Python库skimage绘制二值图像代码实例
2020/04/10 Python
完美解决ARIMA模型中plot_acf画不出图的问题
2020/06/04 Python
Python基于tkinter canvas实现图片裁剪功能
2020/11/05 Python
Python 实现进度条的六种方式
2021/01/06 Python
详解HTML5 录音的踩坑之旅
2017/12/26 HTML / CSS
Html5写一个简单的俄罗斯方块小游戏
2019/12/03 HTML / CSS
什么是数据抽象
2016/11/26 面试题
OLEDBConnection和SQLConnection有什么区别
2013/05/31 面试题
团代会主持词
2014/04/02 职场文书
医院我们的节日活动实施方案
2014/08/22 职场文书
2015年村党支部工作总结
2015/04/30 职场文书
总结会主持词
2015/07/02 职场文书
2015年统计员个人工作总结
2015/07/23 职场文书
九年级化学教学反思
2016/02/22 职场文书
Python Matplotlib绘制两个Y轴图像
2022/04/13 Python