有人问到这样一个代码:
代码语言: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等介绍。