2020年5月18日 / 140次阅读 / 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
©Copyright 麦新杰 Since 2019 Python笔记