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多进程机制实例详解
Jul 02 Python
深入源码解析Python中的对象与类型
Dec 11 Python
python用户评论标签匹配的解决方法
May 31 Python
Python返回数组/List长度的实例
Jun 23 Python
python排序函数sort()与sorted()的区别
Sep 18 Python
Python 实现「食行生鲜」签到领积分功能
Sep 26 Python
解决python3 安装完Pycurl在import pycurl时报错的问题
Oct 15 Python
python  创建一个保留重复值的列表的补码
Oct 15 Python
浅谈Python采集网页时正则表达式匹配换行符的问题
Dec 20 Python
Python基础之条件控制操作示例【if语句】
Mar 23 Python
python pygame实现五子棋小游戏
Oct 26 Python
python利用后缀表达式实现计算器功能
Feb 22 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
《APMServ 5.1.2》使用图解
2006/10/23 PHP
用PHP进行MySQL删除记录操作代码
2008/06/07 PHP
codeigniter教程之上传视频并使用ffmpeg转flv示例
2014/02/13 PHP
将php数组输出html表格的方法
2014/02/24 PHP
destoon找回管理员密码的方法
2014/06/21 PHP
深入解析PHP底层机制及相关原理
2020/12/11 PHP
javascript生成json数据简单示例分享
2014/02/14 Javascript
AngularJS中的过滤器使用详解
2015/06/16 Javascript
jQuery+jsp下拉框联动获取本地数据的方法(附源码)
2015/12/03 Javascript
微信小程序 UI布局常用技巧整理总结
2016/12/05 Javascript
jQuery zTree树插件简单使用教程
2017/01/10 Javascript
基于JS实现二维码图片固定在右下角某处并跟随滚动条滚动
2017/02/08 Javascript
VueJs 搭建Axios接口请求工具
2017/11/20 Javascript
如何选择适合你的JavaScript框架
2017/11/20 Javascript
深入剖析Express cookie-parser中间件实现示例
2018/02/01 Javascript
使用微信小程序开发弹出框应用实例详解
2018/10/18 Javascript
Vue动态加载异步组件的方法
2018/11/21 Javascript
vue router 传参获取不到的解决方式
2019/11/13 Javascript
微信小程序如何实现精确的日期时间选择器
2020/01/21 Javascript
[42:32]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第二场 11.27
2020/12/01 DOTA
Python中使用中文的方法
2011/02/19 Python
Python连接mssql数据库编码问题解决方法
2015/01/01 Python
Windows下为Python安装Matplotlib模块
2015/11/06 Python
Python实现压缩与解压gzip大文件的方法
2016/09/18 Python
python使用turtle绘制分形树
2018/06/22 Python
Python比较配置文件的方法实例详解
2019/06/06 Python
SKECHERS官方旗舰店:美国舒适运动休闲品牌
2017/12/22 全球购物
Right-on官方网站:日本知名的休闲服装品牌
2019/07/12 全球购物
成绩单公证书
2014/04/10 职场文书
党支部三会一课计划
2014/09/24 职场文书
流动人口婚育证明范本
2014/09/26 职场文书
余世维讲座观后感
2015/06/11 职场文书
论语读书笔记
2015/06/26 职场文书
教师节主题班会方案
2015/08/17 职场文书
企业法人任命书
2015/09/21 职场文书
详解JavaScript中Arguments对象用途
2021/08/30 Javascript