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使用百度翻译进行中翻英示例
Apr 14 Python
python使用分治法实现求解最大值的方法
May 12 Python
解决Python 遍历字典时删除元素报异常的问题
Sep 11 Python
Python MySQLdb 使用utf-8 编码插入中文数据问题
Mar 13 Python
对python中的for循环和range内置函数详解
Apr 17 Python
Python3中详解fabfile的编写
Jun 24 Python
Numpy之将矩阵拉成向量的实例
Nov 30 Python
python利用百度云接口实现车牌识别的示例
Feb 21 Python
Python猜数字算法题详解
Mar 01 Python
Python 面向对象静态方法、类方法、属性方法知识点小结
Mar 09 Python
基于PyQT实现区分左键双击和单击
May 19 Python
详解Python中Pyyaml模块的使用
Oct 08 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
MySQL中create table语句的基本语法是
2007/01/15 PHP
使用array mutisort 实现按某字段对数据排序
2013/06/18 PHP
Yii2单元测试用法示例
2016/11/12 PHP
JavaScript 计算当天是本年本月的第几周
2009/03/22 Javascript
Javascript 构造函数,公有,私有特权和静态成员定义方法
2009/11/30 Javascript
JavaScript 保存数组到Cookie的代码
2010/04/14 Javascript
简单的前端js+ajax 购物车框架(入门篇)
2011/10/29 Javascript
鼠标悬浮停留三秒后自动显示大图js代码
2014/09/09 Javascript
Javascript window对象详解
2014/11/12 Javascript
JavaScript中用getDate()方法返回指定日期的教程
2015/06/09 Javascript
Ajax清除浏览器js、css、图片缓存的方法
2015/08/06 Javascript
js获取一组日期中最近连续的天数
2017/05/25 Javascript
vue的全局提示框组件实例代码
2018/02/26 Javascript
微信小程序实现保存图片到相册功能
2018/11/30 Javascript
jQuery中event.target和this的区别详解
2020/08/13 jQuery
Vue仿Bibibili首页的问题
2021/01/21 Vue.js
10个易被忽视但应掌握的Python基本用法
2015/04/01 Python
在Python中使用poplib模块收取邮件的教程
2015/04/29 Python
在DigitalOcean的服务器上部署flaskblog应用
2015/12/19 Python
python中嵌套函数的实操步骤
2019/02/27 Python
python3 Scrapy爬虫框架ip代理配置的方法
2020/01/17 Python
对Matlab中共轭、转置和共轭装置的区别说明
2020/05/11 Python
Python 将代码转换为可执行文件脱离python环境运行(步骤详解)
2021/01/25 Python
美国家居装饰和豪华家具购物网站:One Kings Lane
2018/12/24 全球购物
校长先进事迹材料
2014/02/01 职场文书
教师师德反思材料
2014/02/15 职场文书
销售会计岗位职责
2014/03/15 职场文书
工会主席事迹材料
2014/06/03 职场文书
新农村建设标语
2014/06/24 职场文书
艺术学院毕业生自荐信
2014/07/05 职场文书
2014年项目工作总结
2014/11/24 职场文书
2014年机关工会工作总结
2014/12/19 职场文书
2015年机关党建工作总结
2015/05/22 职场文书
使用 JavaScript 制作页面效果
2021/04/21 Javascript
Python Pandas知识点之缺失值处理详解
2021/05/11 Python
Pyqt5将多个类组合在一个界面显示的完整示例
2021/09/04 Python