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在ubuntu中的几种安装方法(小结)
Dec 08 Python
微信小程序跳一跳游戏 python脚本跳一跳刷高分技巧
Jan 04 Python
python根据unicode判断语言类型实例代码
Jan 17 Python
使用 Python 实现文件递归遍历的三种方式
Jul 18 Python
python多行字符串拼接使用小括号的方法
Mar 19 Python
使用 Python 实现微信群友统计器的思路详解
Sep 26 Python
python得到qq句柄,并显示在前台的方法
Oct 14 Python
使用Python3+PyQT5+Pyserial 实现简单的串口工具方法
Feb 13 Python
Python3.6实现根据电影名称(支持电视剧名称),获取下载链接的方法
Aug 26 Python
pytorch ImageFolder的覆写实例
Feb 20 Python
python实现门限回归方式
Feb 29 Python
PyQt5-QDateEdit的简单使用操作
Jul 12 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
一周学会PHP(视频)Http下载
2006/12/12 PHP
非常不错的MySQL优化的8条经验
2008/03/24 PHP
PHP strncasecmp字符串比较的小技巧
2011/01/04 PHP
PHP开发工具ZendStudio下Xdebug工具使用说明详解
2013/11/11 PHP
php警告Creating default object from empty value 问题的解决方法
2014/04/02 PHP
PHP简单实现模拟登陆功能示例
2017/09/15 PHP
laravel5.0在linux下解决.htaccess无效和去除index.php的问题
2019/10/16 PHP
PHP实现文件上传后台处理脚本
2020/03/04 PHP
6款经典实用的jQuery小插件及源码(对话框/提示工具等等)
2013/02/04 Javascript
node.js中的console.log方法使用说明
2014/12/09 Javascript
jQuery基于图层模仿五星星评价功能的方法
2015/05/07 Javascript
JavaScript实现自动变换表格边框颜色
2015/05/08 Javascript
IE9+已经不对document.createElement向下兼容的解决方法
2015/09/14 Javascript
基于vue.js实现侧边菜单栏
2017/03/20 Javascript
详解vue.js+UEditor集成 [前后端分离项目]
2017/07/07 Javascript
Popup弹出框添加数据实现方法
2017/10/27 Javascript
使用Sonarqube扫描Javascript代码的示例
2018/12/26 Javascript
深入解析Vue源码实例挂载与编译流程实现思路详解
2019/05/05 Javascript
小试小程序云开发(小结)
2019/06/06 Javascript
[52:36]VGJ.S vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python列表与元组详解实例
2013/11/01 Python
使用python在本地电脑上快速处理数据
2017/06/22 Python
python验证码识别实例代码
2018/02/03 Python
Python2和Python3的共存和切换使用
2019/04/12 Python
python实现抽奖小程序
2020/04/15 Python
python requests更换代理适用于IP频率限制的方法
2019/08/21 Python
解决pycharm不能自动补全第三方库的函数和属性问题
2020/03/12 Python
python实现密码验证合格程序的思路详解
2020/06/01 Python
可以随进度显示不同颜色的css3进度条分享
2014/04/11 HTML / CSS
一年级语文教学反思
2014/02/13 职场文书
中华在我心中演讲稿
2014/09/13 职场文书
2014向国旗敬礼网上签名活动总结
2014/09/27 职场文书
离婚协议书范本及离婚须知
2014/10/15 职场文书
幼儿园园长工作总结2015
2015/05/25 职场文书
圣诞晚会主持词开场白
2015/05/28 职场文书
MySQL主从切换的超详细步骤
2022/06/28 MySQL