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 selenium 三种等待方式详解(必会)
Sep 15 Python
Python爬取网页中的图片(搜狗图片)详解
Mar 23 Python
python面向对象_详谈类的继承与方法的重载
Jun 07 Python
python爬虫爬取微博评论案例详解
Mar 27 Python
Python多进程方式抓取基金网站内容的方法分析
Jun 03 Python
基于Python 中函数的 收集参数 机制
Dec 21 Python
Python openpyxl模块原理及用法解析
Jan 19 Python
TensorFlow dataset.shuffle、batch、repeat的使用详解
Jan 21 Python
Python的Django框架实现数据库查询(不返回QuerySet的方法)
May 19 Python
Python如何输出警告信息
Jul 30 Python
详解查看Python解释器路径的两种方式
Oct 15 Python
python必学知识之文件操作(建议收藏)
May 30 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往windows中添加用户
2006/12/06 PHP
理解php原理的opcodes(操作码)
2010/10/26 PHP
php mysql 判断update之后是否更新了的方法
2012/01/10 PHP
CI框架中$this->load->library()用法分析
2016/05/18 PHP
php简单统计中文个数的方法
2016/09/30 PHP
php使用函数pathinfo()、parse_url()和basename()解析URL
2016/11/25 PHP
Laravel学习教程之View模块详解
2017/09/18 PHP
php数组遍历类与用法示例
2019/05/24 PHP
laravel model 两表联查示例
2019/10/24 PHP
PHP底层运行机制与工作原理详解
2020/07/31 PHP
解析arp病毒背后利用的Javascript技术附解密方法
2007/08/06 Javascript
浅析JavaScript中的typeof运算符
2013/11/30 Javascript
js判断字符长度以及中英文数字等
2013/12/31 Javascript
jquery实现图片随机排列的方法
2015/05/04 Javascript
js+HTML5基于过滤器从摄像头中捕获视频的方法
2015/06/16 Javascript
javascript实现网站加入收藏功能
2015/12/16 Javascript
详解如何将 Vue-cli 改造成支持多页面的 history 模式
2017/11/20 Javascript
JavaScript实现元素滚动条到达一定位置循环追加内容
2017/12/28 Javascript
详解JavaScript实现动态的轮播图效果
2019/04/29 Javascript
[01:13:01]2018DOTA2亚洲邀请赛 4.4 淘汰赛 TNC vs VG 第三场
2018/04/05 DOTA
python清理子进程机制剖析
2017/11/23 Python
python 字典中文key处理,读取,比较方法
2018/07/06 Python
Python中出现IndentationError:unindent does not match any outer indentation level错误的解决方法
2020/04/18 Python
Python自动化导出zabbix数据并发邮件脚本
2019/08/16 Python
Python读取实时数据流示例
2019/12/02 Python
Python+OpenCV+图片旋转并用原底色填充新四角的例子
2019/12/12 Python
python sleep和wait对比总结
2021/02/03 Python
英国异国风情旅游网站:Travel Talk Tours(团体旅游、探险旅游、帆船假期)
2018/07/26 全球购物
英国最大的纸工艺品商店:CraftStash
2018/12/01 全球购物
英国PC组件和在线电脑商店:SCAN
2019/04/18 全球购物
高校自主招生教师推荐信
2015/03/23 职场文书
2015年商场工作总结
2015/04/27 职场文书
思想工作总结范文
2015/08/12 职场文书
Python基础学习之奇异的GUI对话框
2021/05/27 Python
使用PostGIS完成两点间的河流轨迹及流经长度的计算(推荐)
2022/01/18 PostgreSQL
Win10系统搭建ftp文件服务器详细教程
2022/08/05 Servers