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使用rsa加密算法模块模拟新浪微博登录
Jan 22 Python
python网络编程示例(客户端与服务端)
Apr 24 Python
浅谈python中的正则表达式(re模块)
Oct 17 Python
关于Python数据结构中字典的心得
Dec 04 Python
Python遍历某目录下的所有文件夹与文件路径
Mar 15 Python
python实现textrank关键词提取
Jun 22 Python
python学生信息管理系统(初级版)
Oct 17 Python
把pandas转换int型为str型的方法
Jan 29 Python
如何使用repr调试python程序
Feb 28 Python
python 数据分析实现长宽格式的转换
May 18 Python
python将数据插入数据库的代码分享
Aug 16 Python
python根据字典的键来删除元素的方法
Aug 16 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程序员工具
2008/05/26 PHP
PHP 变量的定义方法
2010/01/26 PHP
php图片加水印原理(超简单的实例代码)
2013/01/18 PHP
WampServer搭建php环境时遇到的问题汇总
2015/07/23 PHP
非常重要的php正则表达式详解
2016/01/04 PHP
thinkphp5实现微信扫码支付
2019/12/23 PHP
THINKPHP5分页数据对象处理过程解析
2020/10/28 PHP
Google 静态地图API实现代码
2010/11/19 Javascript
jquery 学习之二 属性相关
2010/11/23 Javascript
JSON+JavaScript处理JSON的简单例子
2013/03/20 Javascript
jquery操作下拉列表、文本框、复选框、单选框集合(收藏)
2014/01/08 Javascript
javascript制作的网页侧边弹出框思路及实现代码
2014/05/21 Javascript
JavaScript对象数组排序函数及六个用法
2015/12/23 Javascript
AngularJS学习笔记之依赖注入详解
2016/05/16 Javascript
JS作用域闭包、预解释和this关键字综合实例解析
2016/12/16 Javascript
360doc网站不登录就无法复制内容的解决方法
2018/01/27 Javascript
微信小程序switch开关选择器使用详解
2018/01/31 Javascript
vue 之 .sync 修饰符示例详解
2018/04/21 Javascript
Vue 页面权限控制和登陆验证功能的实例代码
2019/06/20 Javascript
JavaScript常用内置对象用法分析
2019/07/09 Javascript
python实现在目录中查找指定文件的方法
2014/11/11 Python
Python Sql数据库增删改查操作简单封装
2016/04/18 Python
Python3.6中Twisted模块安装的问题与解决
2019/04/15 Python
pyqt5 tablewidget 利用线程动态刷新数据的方法
2019/06/17 Python
PyTorch之nn.ReLU与F.ReLU的区别介绍
2020/06/27 Python
Python Http请求json解析库用法解析
2020/11/28 Python
H5最强接口之canvas实现动态图形功能
2019/05/31 HTML / CSS
英国最大的高品质珠宝和手表专家:Goldsmiths
2017/03/11 全球购物
马来西亚银饰品牌:JEOEL
2017/12/15 全球购物
美国领先的男士和女士内衣购物网站:Freshpair
2019/02/25 全球购物
乐观大学生的自我评价
2014/01/10 职场文书
民间个人借款协议书
2014/09/30 职场文书
2016北大自主招生自荐信模板
2016/01/28 职场文书
浅谈Redis位图(Bitmap)及Redis二进制中的问题
2021/07/15 Redis
Redis模仿手机验证码发送的实现示例
2021/11/02 Redis
NGINX 权限控制文件预览和下载的实现原理
2022/01/18 Servers