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的高级Git库 Gittle
Sep 22 Python
python中如何正确使用正则表达式的详细模式(Verbose mode expression)
Nov 08 Python
Python内置函数delattr的具体用法
Nov 23 Python
Python实现将MySQL数据库表中的数据导出生成csv格式文件的方法
Jan 11 Python
Python即时网络爬虫项目启动说明详解
Feb 23 Python
python 判断网络连通的实现方法
Apr 22 Python
Python中dict和set的用法讲解
Mar 28 Python
Python3 venv搭建轻量级虚拟环境的步骤(图文)
Aug 09 Python
python 求定积分和不定积分示例
Nov 20 Python
python连接打印机实现打印文档、图片、pdf文件等功能
Feb 07 Python
Python 去除字符串中指定字符串
Mar 05 Python
python中time、datetime模块的使用
Dec 14 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/04 星际争霸
求PHP数组最大值,最小值的代码
2011/10/31 PHP
PHP的自定义模板引擎
2017/03/24 PHP
thinkPHP5框架设置404、403等http状态页面的方法
2018/06/05 PHP
JavaScript 弹出窗体点击按钮返回选择数据的实现
2010/04/01 Javascript
jquery 简短几句代码实现给元素动态添加及获取提示信息
2011/09/01 Javascript
整理的比较全的event对像在ie与firefox浏览器中的区别
2013/11/25 Javascript
jquery实现更改表格行顺序示例
2014/04/30 Javascript
Javascript Object 对象学习笔记
2014/12/17 Javascript
纯JavaScript实现的兼容各浏览器的添加和移除事件封装
2015/03/28 Javascript
JS制作手机端自适应缩放显示
2015/06/11 Javascript
jQuery+json实现的简易Ajax调用实例
2015/12/14 Javascript
学习Angularjs分页指令
2016/07/01 Javascript
微信小程序 绘图之饼图实现
2016/10/24 Javascript
Vue.js系列之项目搭建(1)
2017/01/03 Javascript
JavaScript中 DOM操作方法小结
2017/04/25 Javascript
解决Vue不能检测数组或对象变动的问题
2018/02/24 Javascript
微信小程序自定义导航栏实例代码
2019/04/05 Javascript
layer弹出层显示在top顶层的方法
2019/09/11 Javascript
用Golang运行JavaScript的实现示例
2019/11/25 Javascript
vue实现登录、注册、退出、跳转等功能
2020/12/23 Vue.js
[53:44]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma BO3 第一场 1月31日
2021/03/11 DOTA
python表格存取的方法
2018/03/07 Python
对python使用telnet实现弱密码登录的方法详解
2019/01/26 Python
python并发编程 Process对象的其他属性方法join方法详解
2019/08/20 Python
Pycharm plot独立窗口显示的操作
2020/12/11 Python
美国在线纱线商店:Darn Good Yarn
2019/03/20 全球购物
什么是封装
2013/03/26 面试题
物业消防安全责任书
2014/07/23 职场文书
酒店管理失职检讨书
2014/09/16 职场文书
单位委托函范文
2015/01/29 职场文书
小浪底导游词
2015/02/12 职场文书
会议通知格式范文
2015/04/15 职场文书
乡镇安全生产月活动总结
2015/05/08 职场文书
辞职信怎么写?
2019/05/21 职场文书
教你解决往mysql数据库中存入汉字报错的方法
2021/05/06 MySQL