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 django集成cas验证系统
Jul 14 Python
在arcgis使用python脚本进行字段计算时是如何解决中文问题的
Oct 18 Python
CentOS中升级Python版本的方法详解
Jul 10 Python
浅谈python中的数字类型与处理工具
Aug 02 Python
PyQt 实现使窗口中的元素跟随窗口大小的变化而变化
Jun 18 Python
Python 获取windows桌面路径的5种方法小结
Jul 15 Python
Django文件存储 默认存储系统解析
Aug 02 Python
Python实现PyPDF2处理PDF文件的方法示例
Sep 25 Python
python实现对列表中的元素进行倒序打印
Nov 23 Python
Python使用matplotlib绘制Logistic曲线操作示例
Nov 28 Python
python实现吃苹果小游戏
Mar 21 Python
python3.6环境下安装freetype库和基本使用方法(推荐)
May 10 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 date函数参数详解
2006/11/27 PHP
php实现粘贴截图并完成上传功能
2015/05/17 PHP
PHP流Streams、包装器wrapper概念与用法实例详解
2017/11/17 PHP
PHP面向对象程序设计继承用法简单示例
2018/12/28 PHP
PHP创建XML的方法示例【基于DOMDocument类及SimpleXMLElement类】
2019/09/10 PHP
php 命名空间(namespace)原理与用法实例小结
2019/11/13 PHP
WordPress免插件实现面包屑导航的示例代码
2020/08/20 PHP
PHP 实现缩略图
2021/03/09 PHP
学习JavaScript编程语言的8张思维导图分享
2015/03/27 Javascript
JQuery页面地址处理插件jqURL详解
2015/05/03 Javascript
JavaScript中数组去除重复的三种方法
2016/04/22 Javascript
jQuery学习笔记之入门
2016/12/14 Javascript
详解刷新页面vuex数据不消失和不跳转页面的解决
2018/01/30 Javascript
解决vue中使用Axios调用接口时出现的ie数据处理问题
2018/08/13 Javascript
vue拖拽排序插件vuedraggable使用方法详解
2020/08/21 Javascript
ES6小技巧之代替lodash
2019/06/07 Javascript
vue使用高德地图点击下钻上浮效果的实现思路
2019/10/12 Javascript
[01:17:12]职来职往完美电竞专场
2014/09/18 DOTA
python赋值操作方法分享
2013/03/23 Python
Python中文件遍历的两种方法
2014/06/16 Python
深入讲解Python编程中的字符串
2015/10/14 Python
linux安装python修改默认python版本方法
2019/03/31 Python
Django 后台带有字典的列表数据与页面js交互实例
2020/04/03 Python
Python selenium环境搭建实现过程解析
2020/09/08 Python
python向xls写入数据(包括合并,边框,对齐,列宽)
2021/02/02 Python
英国门把手公司:Door Handle Company
2019/05/12 全球购物
《守株待兔》教学反思
2014/03/01 职场文书
卫生巾广告词
2014/03/18 职场文书
文明单位汇报材料
2014/12/24 职场文书
2015年小学生自我评价范文
2015/03/03 职场文书
2015年学校食堂工作总结
2015/04/22 职场文书
总经理2015中秋节致辞
2015/07/29 职场文书
2016年寒假政治学习心得体会
2015/10/09 职场文书
2016中秋节晚会开场白
2015/11/26 职场文书
Golang 语言控制并发 Goroutine的方法
2021/06/30 Golang
SQL Server 中的事务介绍
2022/05/20 SQL Server