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

2020-01-20 16:33:41 浏览数 (1)

有人问到这样一个代码:

代码语言: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等介绍。

0 人点赞