python小白切忌乱用表达式

作者:爱喝马黛茶的安东尼 时间:2021-08-11 19:57:11 

在函数参数中乱用表达式作为默认值

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 等

来源:https://www.py.cn/jishu/jichu/10524.html

标签:python,乱用表达式
0
投稿

猜你喜欢

  • Python爬虫自动化爬取b站实时弹幕实例方法

    2023-03-21 04:45:42
  • 详解vuejs之v-for列表渲染

    2023-07-02 16:56:39
  • python实现分页效果

    2021-07-12 16:00:44
  • ASPImage组件的实现过程[图]

    2008-02-03 15:37:00
  • Python Django基础二之URL路由系统

    2021-05-12 11:50:07
  • tensorflow训练中出现nan问题的解决

    2023-02-10 09:34:09
  • 教你用Python为二年级的学生批量生成数学题

    2023-12-21 13:15:42
  • Python全景系列之模块与包全面解读

    2022-12-09 19:26:48
  • SQL中查找某几个字段完全一样的数据

    2024-01-26 12:55:59
  • Python实现视频中添加音频工具详解

    2022-06-03 12:32:28
  • SQL Server 全文搜索功能介绍

    2024-01-27 13:50:45
  • GO语言入门学习之基本数据类型字符串

    2023-07-16 08:26:31
  • Python 使用 PyQt5 开发的关机小工具分享

    2023-09-15 05:06:02
  • python计算最小优先级队列代码分享

    2022-12-05 03:26:50
  • php获取qq用户昵称和在线状态(实例分析)

    2023-11-14 11:19:22
  • SQL Server 磁盘请求超时的833错误原因及解决方法

    2024-01-14 00:14:43
  • Dephi逆向工具Dede导出函数名MAP导入到IDA中的实现方法

    2023-04-09 06:31:40
  • 浅谈监听单选框radio改变事件(和layui中单选按钮改变事件)

    2024-04-23 09:09:59
  • CSS Expression 的优化

    2009-09-24 13:27:00
  • MySQL服务器 IO 100%的分析与优化方案

    2024-01-24 08:34:10
  • asp之家 网络编程 m.aspxhome.com