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多线程扫描端口示例
Jan 16 Python
Python的垃圾回收机制深入分析
Jul 16 Python
Python遍历文件夹 处理json文件的方法
Jan 22 Python
分享8个非常流行的 Python 可视化工具包
Jun 05 Python
python basemap 画出经纬度并标定的实例
Jul 09 Python
基于Python中的yield表达式介绍
Nov 19 Python
Python常用模块sys,os,time,random功能与用法实例分析
Jan 07 Python
Python列表list操作相关知识小结
Jan 29 Python
python如何调用字典的key
May 25 Python
python爬取微博评论的实例讲解
Jan 15 Python
Django利用AJAX技术实现博文实时搜索
May 06 Python
Python 装饰器(decorator)常用的创建方式及解析
Apr 24 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中使用Oracle数据库(5)
2006/10/09 PHP
apache和php之间协同工作的配置经验分享
2013/04/08 PHP
php变量作用域的深入解析
2013/06/03 PHP
PHP中使用SimpleXML检查XML文件结构实例
2015/01/07 PHP
Zend Framework教程之Zend_Config_Xml用法分析
2016/03/23 PHP
php判断str字符串是否是xml格式数据的方法示例
2017/07/26 PHP
WHOOPS PHP调试库的使用
2017/09/29 PHP
js加强的经典分页实例
2013/03/15 Javascript
nodejs开发环境配置与使用
2014/11/17 NodeJs
EasyUI中实现form表单提交的示例分享
2015/03/01 Javascript
Node.js插件安装图文教程
2016/05/06 Javascript
深入理解jQuery中的事件冒泡
2016/05/24 Javascript
js设置文字颜色的方法示例
2016/12/30 Javascript
Vue数组更新及过滤排序功能
2017/08/10 Javascript
React+Antd+Redux实现待办事件的方法
2019/03/14 Javascript
Vue 实现输入框新增搜索历史记录功能
2019/10/15 Javascript
Vue中key的作用示例代码详解
2020/06/10 Javascript
python批量提交沙箱问题实例
2014/10/08 Python
使用Python抓取模板之家的CSS模板
2015/03/16 Python
Python中执行存储过程及获取存储过程返回值的方法
2017/10/07 Python
pytorch的batch normalize使用详解
2020/01/15 Python
Python在线和离线安装第三方库的方法
2020/10/31 Python
德国净水壶和滤芯品牌:波尔德PearlCo(家用净水器)
2020/04/29 全球购物
Perfume’s Club中文官网:西班牙美妆在线零售品牌
2020/08/24 全球购物
党校学习思想汇报
2014/01/06 职场文书
欢送退休感言
2014/02/08 职场文书
中学生运动会入场词
2014/02/12 职场文书
我为自己代言广告词
2014/03/18 职场文书
科技之星事迹材料
2014/06/02 职场文书
工程学毕业生自荐信
2014/06/14 职场文书
机关作风建设心得体会
2014/10/22 职场文书
2016春节家属慰问信
2015/03/25 职场文书
防汛通知
2015/04/25 职场文书
新闻稿件写作技巧
2015/07/18 职场文书
MySQL利用UNION连接2个查询排序失效详解
2021/11/20 MySQL