Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >#PY小贴士# 函数的默认参数不会每次都新建?

#PY小贴士# 函数的默认参数不会每次都新建?

作者头像
Crossin先生
发布于 2020-01-20 08:33:41
发布于 2020-01-20 08:33:41
47600
代码可运行
举报
运行总次数:0
代码可运行

有人问到这样一个代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def test(x, a=[]):
    a.append(x)
    return a

x = test(1)
y = test(2)
print(x)
print(y)

各位先自己想下输出会是什么?

提问的同学以为答案会是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[1]
[2]

但实际却是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[1, 2]
[1, 2]

他表示想不通:难道不是每次调用函数,没有传参数都会把一个空列表作为参数吗?

这里的原因在于,函数的参数默认值,是在一开始定义(也就是 def)的时候所决定的,并不是到执行时才创建。我换一个例子,就看得更明白了:

请注意输出的时间值:默认参数 a 的时间是紧跟在 def 后的时间,而不是执行时的时间。也就是说,在执行的时候,a=time.time() 并不会重新执行,而是在 def 时就已经算好了。

所以前面的例子也是类似,默认参数 a=[] 是在一开始就创建好的列表,而不是每次调用时再重新创建。

如果你需要每次默认参数获取调用函数的时间,应该写成这样:


#PY小贴士# 里,我们会分享一些 python 知识点、开发中的小技巧、容易踩到的坑,以及学员遇到并在群里提到真实问题。篇幅尽量短小,适合碎片时间阅读,欢迎关注!

如果你在编程学习中有疑问,可选择以下方式向我们提问:

1. 加入码上行动答疑群(最及时响应)

2. 加入知识星球 https://t.zsxq.com/IiAiiQj

3. 发微博加上 #编程教室# @Crossin(非私信)

提问时请表述清楚,附上必要代码、输出等截屏。

也可向本栏目投稿,分享你开发中的经验。采纳后将署名发表,并可附上个人博客、公众号、Github等介绍。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Crossin的编程教室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
#PY小贴士# 我的PyCharm为什么执行结果很诡异?
今天讲的这个小问题,没有用过 PyCharm 的同学会完全不知所云,但用过的人,可能有一半以上概率会遇到这个算不上 bug 但也可能让人迷惑的坑。
Crossin先生
2020/01/20
1.4K0
#PY小贴士# 我的PyCharm为什么执行结果很诡异?
#PY小贴士# 什么是“高内聚,低耦合”
听起来有点玄乎,用大白话来讲,大致就是:写代码要分模块,就像搭积木,一个功能一个模块,每个模块做好一件事,不同模块之间尽量不要互相依赖。这样代码会更简单,易于扩展和维护,可重用性提高,也间接降低了bug的概率。
Crossin先生
2020/01/20
7840
#PY小贴士# 判断输入内容的合法性
当我们通过 input 方法或者网页提交的 form 获取到用户的输入时,往往都要对输入值做一番验证。用户的输入是“不可靠”的,你不知道用户因为手滑、理解错误或者恶意攻击向你的程序发送了怎样的内容。
Crossin先生
2020/01/20
6730
#PY小贴士# 抓下来的网页为什么没有我要的内容?
现在绝大多数网站的内容并非直接通过你访问的 URL 请求直接返回,而是会通过一种叫做 AJAX 的方法,在页面的基本框架加载完毕后,再通过其他的请求向后台服务器再次请求获取的。这被称作“异步加载”,好处是将动态数据和静态的显示框架相分离,既提高了加载速度、提升用户体验,又方便多平台的接口复用。具体细节我不展开了,你可以网上去按我给到的关键字去搜索相关内容,下次我也会专门发下这方面的讲解文章。
Crossin先生
2019/12/19
2.5K0
#PY小贴士# 抓下来的网页为什么没有我要的内容?
#PY小贴士# URL里面为什么会有乱码?
在做网络爬虫的程序或者开发网站的时候,有时会发现 URL 地址里有类似这样的『乱码』,是怎么回事?
Crossin先生
2020/01/20
7190
#PY小贴士# URL里面为什么会有乱码?
#PY小贴士# 同样是排序,sort和sorted有啥不同?
虽然二者都可以实现排序,也都可以设定 key(排序函数)和 reverse(逆序)参数,但在使用时却有个很大的区别:
Crossin先生
2020/01/17
5760
#PY小贴士# 同样是排序,sort和sorted有啥不同?
#PY小贴士# 不要在遍历列表时删除元素
有一个比较少见的 bug:通过 for 循环对一个字典进行遍历的时候,如果向字典中增加新元素,就会导致报错。如图:
Crossin先生
2020/01/20
1.1K0
#PY小贴士# 不要在遍历列表时删除元素
#PY小贴士# 为什么我 pip 装了库,代码里却用不了?
明明我在控制台下通过 pip 安装后显示 successful 安装成功,但在代码里 import,就报错说 module not found,模块不存在?
Crossin先生
2020/01/17
1.5K0
#PY小贴士# for 循环定义的变量,循环外可以用吗?
我们知道,在 python 中要获取一个变量的值,必须是先给它赋值过,不然就是未定义。那么这个 i,代码中没有显式的赋值,在循环体之外还可以用吗?
Crossin先生
2020/01/17
4.5K0
#PY小贴士# git 的冲突
为什么我的 git 在 pull 更新线上最新代码的时候提示失败,然后发现代码里多了一些奇怪的内容:
Crossin先生
2020/01/16
3590
#PY小贴士# git 的冲突
#PY小贴士# 字典可以通过序号索引来访问?
在有些语言里,字典的键必须是字符串。但 python 不是。python 中的不可变类型(实现了__hash__方法的)都可以作为 key。因此,如下这个字典是合法的:
Crossin先生
2020/01/17
6.1K0
#PY小贴士# 字典可以通过序号索引来访问?
C++内联函数,默认参数,占位参数
之前讲过宏定义会经过预处理器进行文本替换,缺点就在于没有类型检查,没有任何编译过程,编译器根本不知道类型是什么.
诺谦
2019/05/24
1.5K0
Python_函数参数与局部变量
形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量
用户7886150
2020/12/01
4140
python中函数的默认参数问题
第三次调用的时候,很容易误以为会L1输出[10],L3输出[20],但是其实都是[10, 20]。这里其实是因为,函数test的x列表参数在没有被指定的时候,这个x列表的值随后就会被利用。其实带有默认参数的会在函数在被定义的时候就被计算,而不是在调用的时候被计算的。L1与L3是在同一个默认列表上操作的,但是L2指定了参数,因此是在另外列表上进行操作的。
生信编程日常
2020/05/26
2.4K0
Python中的默认参数详解
文章的主题 不要使用可变对象作为函数的默认参数例如 list,dict,因为def是一个可执行语句,只有def执行的时候才会计算默认默认参数的值,所以使用默认参数会造成函数执行的时候一直在使用同一个对象,引起bug。 基本原理 在 Python 源码中,我们使用def来定义函数或者方法。在其他语言中,类似的东西往往只是一一个语法声明关键字,但def却是一个可执行的指令。Python代码执行的时候先会使用 compile 将其编译成 PyCodeObject. PyCodeObject 本质上依然是一
py3study
2020/01/12
1.6K0
Python面试题目之Python函数默认参数陷阱
python中,万物皆对象。python中不存在所谓的传值调用,一切传递的都是对象的引用,也可以认为是传址。
Jetpropelledsnake21
2019/02/15
5710
函数
定义:函数是指将一组语句的集合通过一个名字(函数名)封装起来,要执行这个函数,只需要调用其函数名即可。
py3study
2020/01/21
5100
【愚公系列】2021年12月 Python教学课程 12-Python函数
函数(function)是用于完成特定任务的程序代码的自包含单元。在面向对象编程的类中,函数通常被称作方法。不同的函数在程序中扮演着不同的角色,起着不同的作用,执行不同的动作。比如 print()函数可以将对象打印到屏幕上;还有一些函数能够返回一个值以供程序使用,比如 len()将可计算长度的对象的元素个数返回给程序。
愚公搬代码
2021/12/14
5740
Python入门之函数的形式参数与实参/参数的具体使用方法
 本篇目录:     一、 函数参数之形式参数与实参     二、 函数参数的具体使用 #1、位置参数:按照从左到右的顺序定义的参数 位置形参:必选参数 位置实参:按照位置给形参传值 #2、关键字参数:按照key=value的形式定义的实参 无需按照位置为形参传值 注意的问题: 1. 关键字实参必须在位置实参右面 2. 对同一个形参不能重复传值 #3、默认参数:形参在定义时就已
Jetpropelledsnake21
2018/05/02
1.5K0
python函数高级
函数是指将一组语句的集合通过一个名字(函数名)封装起来,想要执行这个函数,只需要调用函数名即可
程序员皮克
2022/01/04
5250
推荐阅读
相关推荐
#PY小贴士# 我的PyCharm为什么执行结果很诡异?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验