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实战小程序利用matplotlib模块画图代码分享
Dec 09 Python
使用Python搭建虚拟环境的配置方法
Feb 28 Python
python装饰器深入学习
Apr 06 Python
Python 获取中文字拼音首个字母的方法
Nov 28 Python
实例详解Matlab 与 Python 的区别
Apr 26 Python
Python中print函数简单使用总结
Aug 05 Python
使用Django搭建web服务器的例子(最最正确的方式)
Aug 29 Python
使用OpenCV-python3实现滑动条更新图像的Canny边缘检测功能
Dec 12 Python
python学生信息管理系统实现代码
Dec 17 Python
matplotlib 生成的图像中无法显示中文字符的解决方法
Jun 10 Python
Python select及selectors模块概念用法详解
Jun 22 Python
虚拟环境及venv和virtualenv的区别说明
Feb 05 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
全国FM电台频率大全 - 31 新疆维吾尔族自治区
2020/03/11 无线电
PHP 获取文件路径(灵活应用__FILE__)
2013/02/15 PHP
深入extjs与php参数交互的详解
2013/06/25 PHP
php实现仿写CodeIgniter的购物车类
2015/07/29 PHP
php opendir()列出目录下所有文件的实例代码
2016/10/02 PHP
thinkphp5 + ajax 使用formdata提交数据(包括文件上传) 后台返回json完整实例
2020/03/02 PHP
tbody元素支持嵌套的注意方法
2007/03/24 Javascript
Jquery图形报表插件 jqplot简介及参数详解
2012/10/10 Javascript
Javascript中匿名函数的多种调用方式总结
2013/12/06 Javascript
jQuery实现的一个tab切换效果内部还嵌有切换
2014/08/10 Javascript
关于jQuery中fade(),show()起始位置的一点小发现
2017/04/25 jQuery
Vue实现搜索 和新闻列表功能简单范例
2018/03/16 Javascript
Angular 容器部署的方法
2018/04/17 Javascript
脚手架vue-cli工程webpack的基本用法详解
2018/09/29 Javascript
Vue项目自动转换 px 为 rem的实现方法
2018/10/29 Javascript
vue-cli 首屏加载优化问题
2018/11/06 Javascript
python结合API实现即时天气信息
2016/01/19 Python
python安装mysql-python简明笔记(ubuntu环境)
2016/06/25 Python
Python使用zip合并相邻列表项的方法示例
2018/03/17 Python
一百多行python代码实现抢票助手
2018/09/25 Python
windows下python虚拟环境virtualenv安装和使用详解
2019/07/16 Python
详解Python中的正斜杠与反斜杠
2019/08/09 Python
TensorFlow基本的常量、变量和运算操作详解
2020/02/03 Python
python实现飞行棋游戏
2020/02/05 Python
Python修改列表值问题解决方案
2020/03/06 Python
Python+PyQt5实现灭霸响指功能
2020/05/25 Python
推荐技术人员一款Python开源库(造数据神器)
2020/07/08 Python
护士实习生自我鉴定范文
2013/12/10 职场文书
法学院方阵解说词
2014/01/29 职场文书
一年级评语大全
2014/04/23 职场文书
学校班班通实施方案
2014/06/11 职场文书
阅兵口号
2014/06/19 职场文书
质量在我心中演讲稿
2014/09/02 职场文书
汽车销售员岗位职责
2015/04/11 职场文书
入党介绍人意见怎么写
2015/06/03 职场文书
学雷锋主题班会教案
2015/08/13 职场文书