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实现360皮肤按钮控件示例
Feb 21 Python
Python编程二分法实现冒泡算法+快速排序代码示例
Jan 15 Python
pandas 两列时间相减换算为秒的方法
Apr 20 Python
django 修改server端口号的方法
May 14 Python
python生成器与迭代器详解
Jan 01 Python
python自动发微信监控报警
Sep 06 Python
详解python opencv、scikit-image和PIL图像处理库比较
Dec 26 Python
在Python中利用pickle保存变量的实例
Dec 30 Python
python plt可视化——打印特殊符号和制作图例代码
Apr 17 Python
Python 批量下载阴阳师网站壁纸
May 19 Python
Python基础之进程详解
May 21 Python
Python 居然可以在 Excel 中画画你知道吗
Feb 15 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中通过加号合并数组的一个简单方法分享
2011/01/27 PHP
将PHP从5.3.28升级到5.3.29时Nginx出现502错误
2015/05/09 PHP
PHP实现图的邻接矩阵表示及几种简单遍历算法分析
2017/11/24 PHP
PHP实现按之字形顺序打印二叉树的方法
2018/01/16 PHP
PHP date()格式MySQL中插入datetime方法
2019/01/29 PHP
可实现多表单提交的javascript函数
2007/08/01 Javascript
用JQuery调用Session的实现代码
2010/10/29 Javascript
Javascript面向对象编程
2012/03/18 Javascript
利用js正则表达式验证手机号,email地址,邮政编码
2014/01/23 Javascript
使用Node.js实现一个简单的FastCGI服务器实例
2014/06/09 Javascript
Redis基本知识、安装、部署、配置笔记
2015/03/05 Javascript
js游戏人物上下左右跑步效果代码分享
2015/08/28 Javascript
第一次接触神奇的Bootstrap网格系统
2016/07/27 Javascript
JS实用的带停顿的逐行文本循环滚动效果实例
2016/11/23 Javascript
jquery validation验证表单插件
2017/01/07 Javascript
jQuery实现select模糊查询(反射机制)
2017/01/14 Javascript
使用Vue开发一个实时性时间转换指令
2018/01/17 Javascript
利用JS实现一个同Excel表现的智能填充算法
2018/08/13 Javascript
Node.js搭建WEB服务器的示例代码
2018/08/15 Javascript
JavaScript函数、闭包、原型、面向对象学习笔记
2018/09/06 Javascript
vue多级复杂列表展开/折叠及全选/分组全选实现
2018/11/05 Javascript
Python_LDA实现方法详解
2017/10/25 Python
python安装pil库方法及代码
2019/06/25 Python
linux下python中文乱码解决方案详解
2019/08/28 Python
在tensorflow下利用plt画论文中loss,acc等曲线图实例
2020/06/15 Python
python如何导入依赖包
2020/07/13 Python
python进行二次方程式计算的实例讲解
2020/12/06 Python
利用Python实现自动扫雷小脚本
2020/12/17 Python
OpenCV+Python3.5 简易手势识别的实现
2020/12/21 Python
matplotlib相关系统目录获取方式小结
2021/02/03 Python
Python调用SMTP服务自动发送Email的实现步骤
2021/02/07 Python
Myprotein瑞典官方网站:畅销欧洲英国运动营养品牌
2018/01/22 全球购物
千元咖啡店的创业计划书范文
2013/12/29 职场文书
教师新年寄语
2014/04/03 职场文书
酒店优秀员工事迹材料
2014/06/02 职场文书
python实现进度条的多种实现
2021/04/29 Python