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入门篇之字符串
Oct 17 Python
用Python编写一个简单的Lisp解释器的教程
Apr 03 Python
深入理解Python中命名空间的查找规则LEGB
Aug 06 Python
Python实现简单多线程任务队列
Feb 27 Python
python中实现迭代器(iterator)的方法示例
Jan 19 Python
Python 登录网站详解及实例
Apr 11 Python
Python内置模块turtle绘图详解
Dec 09 Python
Python2和Python3之间的str处理方式导致乱码的讲解
Jan 03 Python
Python基于Opencv来快速实现人脸识别过程详解(完整版)
Jul 11 Python
django中使用POST方法获取POST数据
Aug 20 Python
将tensorflow模型打包成PB文件及PB文件读取方式
Jan 23 Python
python语言实现贪吃蛇游戏
Nov 13 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中的串行化变量和序列化对象
2006/09/05 PHP
模拟OICQ的实现思路和核心程序(三)
2006/10/09 PHP
使用 PHPStorm 开发 Laravel
2015/03/24 PHP
如何让div span等元素能响应键盘事件操作指南
2012/11/13 Javascript
JS+ACTIVEX实现网页选择本地目录路径对话框
2013/03/18 Javascript
JS图片无缝滚动(简单利于使用)
2013/06/17 Javascript
jQuery菜单插件用法实例
2015/07/25 Javascript
使用控制台破解百小度一个月只准改一次名字
2015/08/13 Javascript
js实现的早期滑动门菜单效果代码
2015/08/27 Javascript
angular和BootStrap3实现购物车功能
2017/01/25 Javascript
JavaScript之RegExp_动力节点Java学院整理
2017/06/29 Javascript
微信小程序实现导航栏选项卡效果
2020/06/19 Javascript
vue检测对象和数组的变化分析
2018/06/30 Javascript
使用Vue做一个简单的todo应用的三种方式的示例代码
2018/10/20 Javascript
Flutter 超实用简单菜单弹出框 PopupMenuButton功能
2019/08/06 Javascript
夯基础之手撕javascript继承详解
2020/11/09 Javascript
Python安装第三方库及常见问题处理方法汇总
2016/09/13 Python
用pandas按列合并两个文件的实例
2018/04/12 Python
Python之文字转图片方法
2018/05/10 Python
使用Python-OpenCV向图片添加噪声的实现(高斯噪声、椒盐噪声)
2019/05/28 Python
python爬虫之自制英汉字典
2019/06/24 Python
python的命名规则知识点总结
2019/10/04 Python
使用Python生成200个激活码的实现方法
2019/11/22 Python
Python如何实现强制数据类型转换
2019/11/22 Python
Pytorch之Tensor和Numpy之间的转换的实现方法
2020/09/03 Python
使用CSS3制作响应式导航菜单的方法
2015/07/12 HTML / CSS
HTML5如何实现元素拖拽
2016/03/11 HTML / CSS
世界上最大的售后摩托车零配件超市:J&P Cycles
2017/12/08 全球购物
国际奢侈品品牌童装购物网站:Designer Childrenswear
2019/05/08 全球购物
安全事故检讨书
2014/01/18 职场文书
厂办主管岗位职责范本
2014/02/28 职场文书
党课培训心得体会
2014/09/02 职场文书
学习朴航瑛老师爱岗敬业先进事迹思想汇报
2014/09/17 职场文书
孝老爱亲事迹材料
2014/12/24 职场文书
授权协议书范本(3篇)
2019/10/15 职场文书
浅析Django接口版本控制
2021/06/26 Python