python默认参数问题

我们在定义默认参数时,有时会遇到一写似乎难以理解的问题。比如,在第二次调用函数时,默认参数记住了上一次执行的结果:

>>> def test(L=[3,]):
...     L.append("end")
...     print(id(L))
...     return L
...
>>> test()
2529720312648
[3, 'end']
>>> test()
2529720312648
[3, 'end', 'end']
>>> test()
2529720312648
[3, 'end', 'end', 'end']
>>> test([1,2,3])
2529720300488
[1, 2, 3, 'end']
>>> test()
2529720312648
[3, 'end', 'end', 'end', 'end']
>>>

看了一下上面代码,我们不难发现,当我们不带参数执行test()函数时,它的默认参数会记住上次的执行结果。原因时默认参数是一个列表变量,它的地址在开始时已经定住了,所以每次改变都会被记录下来。
但是,但你带参数执行test([1,2,3])时,你会发现,函数会为[1,2,3]重新开辟一个地址。
本质上,默认参数和你自己输入的列表参数时两个不同的变量。所以,才会有上面精彩的部分。


版权:保留所有解释权。转发请注明出处。


posted @ 2017-07-20 16:14  busui  阅读(312)  评论(0编辑  收藏  举报