前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >#PY小贴士# 函数的默认参数不会每次都新建?

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

作者头像
Crossin先生
发布2020-01-20 16:33:41
4360
发布2020-01-20 16:33:41
举报
文章被收录于专栏:Crossin的编程教室

有人问到这样一个代码:

代码语言:javascript
复制
def test(x, a=[]):
    a.append(x)
    return a

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

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

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

代码语言:javascript
复制
[1]
[2]

但实际却是:

代码语言:javascript
复制
[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 删除。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档