小心:函数参数默认值为可变对象

2020年5月18日 / 3次阅读 / Last Modified 2020年5月18日
函数参数

python教程中,有一个重要细节,在定义函数的时候,参数默认值只会evaluate一次,如果这个默认值是一个可变(mutable)对象,可能会有意想不到的异常。

>>> def test(a,b=[]):
...     b.append(a)
...     print(id(b))
...     print(b)
...
>>> test(1)
4805192
[1]
>>> test(1)
4805192
[1, 1]
>>> test(1)
4805192
[1, 1, 1]
>>> test(1)
4805192
[1, 1, 1, 1]
>>> test(1)
4805192

test函数参数b的默认值是一个空的list,list是mutable对象。看下面的几次执行情况,每一次执行test函数时,参数b并不都是空的list,我们看到一个地址不变的list对象不断在增长。默认值在python解释器中,值evaluate一次!

>>> test(1,[2])
31409096
[2, 1]
>>> test(1,[2,3])
31409096
[2, 3, 1]
>>> test(1,[5,6,7])
31409096
[5, 6, 7, 1]

这是不使用默认值时的调用情况。官方建议在这种情况下,默认值最好是None,在函数内部再做判断。

-- EOF --

本文链接:https://www.pynote.net/archives/1954

留言区

电子邮件地址不会被公开。 必填项已用*标注


前一篇:
后一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top