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 25 Python
Python中使用tarfile压缩、解压tar归档文件示例
Apr 05 Python
Python中用startswith()函数判断字符串开头的教程
Apr 07 Python
Python根据成绩分析系统浅析
Feb 11 Python
对Django 中request.get和request.post的区别详解
Aug 12 Python
Python.append()与Python.expand()用法详解
Dec 18 Python
Python re正则表达式元字符分组()用法分享
Feb 10 Python
python实现一次性封装多条sql语句(begin end)
Jun 06 Python
Python实现文件压缩和解压的示例代码
Aug 12 Python
Django实现随机图形验证码的示例
Oct 15 Python
一篇文章带你搞定Ubuntu中打开Pycharm总是卡顿崩溃
Nov 02 Python
Sublime Text3最新激活注册码分享适用2020最新版 亲测可用
Nov 12 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 SQL防注入代码集合
2008/04/25 PHP
splice slice区别
2006/10/09 Javascript
代码精简的可以实现元素圆角的js函数
2007/07/21 Javascript
JQuery与Ajax常用代码实现对比
2009/10/03 Javascript
javascript 浏览器检测代码精简版
2010/03/04 Javascript
window.dialogArguments 使用说明
2011/04/11 Javascript
js获取当月最后一天实例代码
2013/11/19 Javascript
javascript 通用loading动画效果实例代码
2014/01/14 Javascript
cookie的secure属性详解
2015/04/08 Javascript
Easyui 之 Treegrid 笔记
2016/04/29 Javascript
详解Vue CLI3配置之filenameHashing使用和源码设计使用和源码设计
2018/08/31 Javascript
从组件封装看Vue的作用域插槽的实现
2019/02/12 Javascript
python利用sklearn包编写决策树源代码
2017/12/21 Python
教你利用Python玩转histogram直方图的五种方法
2018/07/30 Python
python3.7.0的安装步骤
2018/08/27 Python
selenium python 实现基本自动化测试的示例代码
2019/02/25 Python
python 画3维轨迹图并进行比较的实例
2019/12/06 Python
pandas实现将日期转换成timestamp
2019/12/07 Python
实现Python与STM32通信方式
2019/12/18 Python
自定义Django默认的sitemap站点地图样式
2020/03/04 Python
Pyecharts 动态地图 geo()和map()的安装与用法详解
2020/03/25 Python
利用matplotlib为图片上添加触发事件进行交互
2020/04/23 Python
Python如何使用27行代码绘制星星图
2020/07/20 Python
Python持续监听文件变化代码实例
2020/07/22 Python
pytorch __init__、forward与__call__的用法小结
2021/02/27 Python
印尼在线购买隐形眼镜网站:Lensza.co.id
2019/04/27 全球购物
GetYourGuide台湾:预订旅游活动、景点和旅游项目
2019/06/10 全球购物
世界各地的当地人的食物体验:Eatwith
2019/07/26 全球购物
如何高效率的查找一个月以内的数据
2012/04/15 面试题
实习单位接收函
2014/01/11 职场文书
文明单位申报材料
2014/12/23 职场文书
优秀教育工作者事迹材料
2014/12/24 职场文书
学校食堂管理制度
2015/08/04 职场文书
区域销售大会开幕词
2016/03/04 职场文书
PostgreSQL事务回卷实战案例详析
2022/03/25 PostgreSQL
最新动漫情报:2022年7月新番定档超过30部, OVERLORD骨王第四季也在其中噢
2022/05/04 日漫