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编程之string相关操作实例详解
Jul 22 Python
微信跳一跳python辅助软件思路及图像识别源码解析
Jan 04 Python
Python cookbook(数据结构与算法)筛选及提取序列中元素的方法
Mar 19 Python
python中pylint使用方法(pylint代码检查)
Apr 06 Python
基于Python 装饰器装饰类中的方法实例
Apr 21 Python
python 读取视频,处理后,实时计算帧数fps的方法
Jul 10 Python
python 采用paramiko 远程执行命令及报错解决
Oct 21 Python
python图片剪裁代码(图片按四个点坐标剪裁)
Mar 10 Python
python3 实现口罩抽签的功能
Mar 11 Python
python中什么是面向对象
Jun 11 Python
Django Session和Cookie分别实现记住用户登录状态操作
Jul 02 Python
python 实现德洛内三角剖分的操作
Apr 22 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数据结构与算法(PHP描述) 快速排序 quick sort
2012/06/21 PHP
简单的php文件上传(实例)
2013/10/27 PHP
本地计算机无法启动Apache故障处理
2014/08/08 PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
2019/12/20 PHP
JQuery 插件模板 制作jquery插件的朋友可以参考下
2010/03/17 Javascript
JQuery设置和去除disabled属性的5种方法总结
2013/05/16 Javascript
jQuery过滤选择器用法分析
2015/02/10 Javascript
关于动态执行代码(js的Eval)实例详解
2016/08/15 Javascript
详解js中call与apply关键字的作用
2016/11/21 Javascript
JavaScript中清空数组的方法总结
2016/12/02 Javascript
bootstrap为水平排列的表单和内联表单设置可选的图标
2017/02/15 Javascript
Angular实现跨域(搜索框的下拉列表)
2017/02/16 Javascript
如何重置vue打印变量的显示方式
2017/12/06 Javascript
JS运动特效之完美运动框架实例分析
2018/01/24 Javascript
vue实现的上传图片到数据库并显示到页面功能示例
2018/03/17 Javascript
解决使用vue.js路由后失效的问题
2018/03/17 Javascript
对Vue.js之事件的绑定(v-on: 或者 @ )详解
2018/09/15 Javascript
小程序云开发初探(小结)
2018/10/24 Javascript
VUE实现强制渲染,强制更新
2019/10/29 Javascript
[03:26]回顾2015国际邀请赛中国区预选赛
2015/06/09 DOTA
使用python加密自己的密码
2015/08/04 Python
Python中查看文件名和文件路径
2017/03/31 Python
Python利用BeautifulSoup解析Html的方法示例
2017/07/30 Python
Windows下安装Scrapy
2018/10/17 Python
pycharm中成功运行图片的配置教程
2018/10/28 Python
Python中作用域的深入讲解
2018/12/10 Python
对python 多个分隔符split 的实例详解
2018/12/20 Python
Tensorflow: 从checkpoint文件中读取tensor方式
2020/02/10 Python
学生如何注册Pycharm专业版以及pycharm的安装
2020/09/24 Python
Python实现壁纸下载与轮换
2020/10/19 Python
Python调用ffmpeg开源视频处理库,批量处理视频
2020/11/16 Python
Hunter Boots美国官方网站:赫特威灵顿雨靴
2018/06/16 全球购物
Blue Nile蓝色尼罗河香港官网:世界最大在线钻石珠宝销售商
2020/05/07 全球购物
俄罗斯领先的移动和数字设备在线商店:Svyaznoy.ru
2020/12/21 全球购物
2015年党员创先争优公开承诺书
2015/04/27 职场文书
Vue + iView实现Excel上传功能的完整代码
2021/06/22 Vue.js