函数的默认参数不会每次都新建?

最近同事问了个参数的问题,和他一起讨论了一下。
他给了我一个这样的代码:

def test(x, a=[]):
    a.append(x)
    return a

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

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

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

[1]
[2]

但实际却是:

[1, 2]
[1, 2]

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

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

import time

print("time befor def:",time.time())

def test(a = time.time()):
    print(a)

time.sleep(1)
print("time befor call1", time.time())
test()
time.sleep(3)
print("time befor call2", time.time())
test()

输出:

time befor def: 1577172118.2069783
time befor call1 1577172119.20733
1577172118.2069783
time befor call2 1577172122.208009
1577172118.2069783