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实现简单购物商城
May 21 Python
浅谈python中的变量默认是什么类型
Sep 11 Python
Python基于递归实现电话号码映射功能示例
Apr 13 Python
使用Python进行QQ批量登录的实例代码
Jun 11 Python
python爬虫之自动登录与验证码识别
Jun 15 Python
Python闭包和装饰器用法实例详解
May 22 Python
浅谈Python类中的self到底是干啥的
Nov 11 Python
python opencv根据颜色进行目标检测的方法示例
Jan 15 Python
详解Python 循环嵌套
Jul 09 Python
Python DataFrame使用drop_duplicates()函数去重(保留重复值,取重复值)
Jul 20 Python
详解selenium + chromedriver 被反爬的解决方法
Oct 28 Python
python 实现控制鼠标键盘
Nov 27 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 获取远程文件大小的3种解决方法
2013/07/11 PHP
php自动加载autoload机制示例分享
2014/02/20 PHP
PHP大神的十大优良习惯
2016/09/14 PHP
JavaScript 利用Cookie记录用户登录信息
2009/12/08 Javascript
JS编程小常识很有用
2012/11/26 Javascript
Json和Jsonp理论实例代码详解
2013/11/15 Javascript
文本框(input)获取焦点(onfocus)时样式改变的示例代码
2014/01/10 Javascript
JS 获取浏览器和屏幕宽高等信息代码
2014/03/31 Javascript
javascript判断数组内是否重复的方法
2015/04/21 Javascript
Javascript生成全局唯一标识符(GUID,UUID)的方法
2016/02/27 Javascript
js一维数组、多维数组和对象的混合使用方法
2016/04/03 Javascript
JS实现鼠标滑过显示边框的菜单效果
2016/09/21 Javascript
原生JS仿QQ阅读点击展开、收起效果
2017/03/08 Javascript
JavaScript数组和对象的复制
2017/03/21 Javascript
AngularJS使用ng-class动态增减class样式的方法示例
2017/05/18 Javascript
Vue2.0基于vue-cli+webpack父子组件通信(实例讲解)
2017/09/14 Javascript
Three.js利用Detector.js插件如何实现兼容性检测详解
2017/09/26 Javascript
Javascript网页抢红包外挂实现分享
2018/01/11 Javascript
解决在Bootstrap模糊框中使用WebUploader的问题
2018/03/22 Javascript
React性能优化系列之减少props改变的实现方法
2019/01/17 Javascript
jQuery实现简单全选框
2020/09/13 jQuery
[01:18:33]Secret vs VGJ.S Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
[54:10]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
Ubuntu下创建虚拟独立的Python环境全过程
2017/02/10 Python
详解Python3操作Mongodb简明易懂教程
2017/05/25 Python
用virtualenv建立多个Python独立虚拟开发环境
2017/07/06 Python
Python基于回溯法子集树模板解决m着色问题示例
2017/09/07 Python
Python聊天室程序(基础版)
2018/04/01 Python
Python3连接SQLServer、Oracle、MySql的方法
2018/06/28 Python
PyQt5组件读取参数的实例
2019/06/25 Python
Python对Excel按列值筛选并拆分表格到多个文件的代码
2019/11/05 Python
通过celery异步处理一个查询任务的完整代码
2019/11/19 Python
详解用python -m http.server搭一个简易的本地局域网
2020/09/24 Python
浅谈HTML5 & CSS3的新交互特性
2016/07/19 HTML / CSS
素食餐饮项目创业计划书
2014/02/02 职场文书
MySQL 全文检索的使用示例
2021/06/07 MySQL