python小白切忌乱用表达式


Posted in Python onMay 29, 2020

在函数参数中乱用表达式作为默认值

Python允许给一个函数的某个参数设置默认值以使该参数成为一个可选参数。尽管这是这门语言很棒的一个功能,但是这当这个默认值是可变对象(mutable)时,那就有些麻烦了。例如,看下面这个Python函数定义:

>>> def foo(bar=[]):    
# bar是可选参数,如果没有指明的话,默认值是[]
...  bar.append("baz")  
# 但是这行可是有问题的,走着瞧…
...  return bar

人们常犯的一个错误是认为每次调用这个函数时不给这个可选参数赋值的话,它总是会被赋予这个默认表达式的值。例如,在上面的代码中,程序员可能会认为重复调用函数foo() (不传参数bar给这个函数),这个函数会总是返回‘baz',因为我们假定认为每次调用foo()的时候(不传bar),参数bar会被置为[](即,一个空的列表)。

那么我们来看看这么做的时候究竟会发生什么:

>>> foo()
["baz"]
>>> foo()
["baz", "baz"]
>>> foo()
["baz", "baz", "baz"]

嗯?为什么每次调用foo()的时候,这个函数总是在一个已经存在的列表后面添加我们的默认值“baz”,而不是每次都创建一个新的列表?

答案是一个函数参数的默认值,仅仅在该函数定义的时候,被赋值一次。如此,只有当函数foo()第一次被定义的时候,才讲参数bar的默认值初始化到它的默认值(即一个空的列表)。当调用foo()的时候(不给参数bar),会继续使用bar最早初始化时的那个列表。

由此,可以有如下的解决办法:

>>> def foo(bar=None):
...  if bar is None:   
# 或者用 if not bar:
...    bar = []
...  bar.append("baz")
...  return bar
...
>>> foo()
["baz"]
>>> foo()
["baz"]
>>> foo()
["baz"]

内容补充:

正则字符 释义 举例
+ 前面元素至少出现一次 ab+:ab、abbbb 等
* 前面元素出现0次或多次 ab*:a、ab、abb 等
? 匹配前面的一次或0次 Ab?: A、Ab 等
^ 作为开始标记 ^a:abc、aaaaaa等
$ 作为结束标记 c$:abc、cccc 等
\d 数字 3、4、9 等 正则字符 释义 举例 + 前面元素至少出现一次 ab+:ab、abbbb 等 * 前面元素出现0次或多次 ab*:a、ab、abb 等 ? 匹配前面的一次或0次 Ab?: A、Ab 等 ^ 作为开始标记 ^a:abc、aaaaaa等 $ 作为结束标记 c$:abc、cccc 等 \d 数字 3、4、9 等 \D 非数字 A、a、- 等 [a-z] A到z之间的任意字母 a、p、m 等 [0-9] 0到9之间的任意数字 0、2、9 等
\D 非数字 A、a、- 等
[a-z] A到z之间的任意字母 a、p、m 等
[0-9] 0到9之间的任意数字 0、2、9 等

到此这篇关于python小白切忌乱用表达式的文章就介绍到这了,更多相关python乱用表达式内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python基于回溯法子集树模板解决0-1背包问题实例
Sep 02 Python
python如何为创建大量实例节省内存
Mar 20 Python
Python利用正则表达式实现计算器算法思路解析
Apr 25 Python
python实现逆序输出一个数字的示例讲解
Jun 25 Python
python和pygame实现简单俄罗斯方块游戏
Feb 19 Python
使用pandas read_table读取csv文件的方法
Jul 04 Python
Python一键查找iOS项目中未使用的图片、音频、视频资源
Aug 12 Python
django项目用higcharts统计最近七天文章点击量
Aug 17 Python
TensorFlow MNIST手写数据集的实现方法
Feb 05 Python
Python单元测试模块doctest的具体使用
Feb 10 Python
Numpy一维线性插值函数的用法
Apr 22 Python
python学习之panda数据分析核心支持库
May 07 Python
Python爬虫实现百度翻译功能过程详解
May 29 #Python
Django中的模型类设计及展示示例详解
May 29 #Python
如何理解Python中包的引入
May 29 #Python
浅谈django channels 路由误导
May 28 #Python
Python如何实现FTP功能
May 28 #Python
python基于socket函数实现端口扫描
May 28 #Python
Python中and和or如何使用
May 28 #Python
You might like
利用 window_onload 实现select默认选择
2006/10/09 PHP
搜索和替换文件或目录的一个好类--很实用
2006/10/09 PHP
PHP生成不同颜色、不同大小的tag标签函数
2013/09/23 PHP
ThinkPHP的Widget扩展实例
2014/06/19 PHP
php简单实现MVC
2015/02/05 PHP
Laravel5.1 框架路由基础详解
2020/01/04 PHP
PHP学习记录之常用的魔术常量详解
2019/12/12 PHP
TP框架实现上传一张图片和批量上传图片的方法分析
2020/04/23 PHP
使用原生javascript创建通用表单验证——更锋利的使用dom对象
2011/09/13 Javascript
js 操作select与option(示例讲解)
2013/12/20 Javascript
Angularjs使用directive自定义指令实现attribute继承的方法详解
2016/08/05 Javascript
卸载安装Node.js与npm过程详解
2016/08/15 Javascript
javascript数字验证的实例代码(推荐)
2016/08/20 Javascript
JS弹出窗口的运用与技巧大全
2016/11/01 Javascript
老生常谈js-react组件生命周期
2017/05/02 Javascript
jQuery+ajax实现修改密码验证功能实例详解
2017/07/06 jQuery
javascript  数组排序与对象排序的实例
2017/07/17 Javascript
vue中七牛插件使用的实例代码
2017/07/28 Javascript
electron实现qq快捷登录的方法示例
2018/10/22 Javascript
JavaScript 生成唯一ID的几种方式
2021/02/19 Javascript
Python选择排序、冒泡排序、合并排序代码实例
2015/04/10 Python
Python绘制3d螺旋曲线图实例代码
2017/12/20 Python
Django用数据库表反向生成models类知识点详解
2020/03/25 Python
Python实现aes加密解密多种方法解析
2020/05/15 Python
python和C++共享内存传输图像的示例
2020/10/27 Python
纽约服装和生活方式品牌:Saturdays NYC
2017/08/13 全球购物
个人简历中的自我评价怎么写
2014/01/26 职场文书
技术比武方案
2014/05/19 职场文书
师德师风承诺书
2014/05/23 职场文书
网络文明传播志愿者活动方案
2014/08/20 职场文书
2015新学期家长寄语
2015/02/26 职场文书
个人党性锻炼总结
2015/03/05 职场文书
小学生光盘行动倡议书
2015/04/28 职场文书
《唯一的听众》教学反思
2016/02/18 职场文书
golang如何去除多余空白字符(含制表符)
2021/04/25 Golang
Python中glob库实现文件名的匹配
2021/06/18 Python