强调一点,函数形参的默认值只计算一次,发生在函数定义域定义的时候。
例如:
i = 5
def f(arg=i):
print arg
i = 6
f()
以上代码将打印5而不是6.
再看一个比较明显的例子,当默认参数为可变的对象如列表、字典或大部分类的实例时:
def f(a, L=[]):
L.append(a)
return L
print f(1)
print f(2)
print f(3)
将输出以下结果:
[1]
[1, 2]
[1, 2, 3]
这是因为定义函数的时候,变量L指向了一片内存地址,在后面的反复调用过程中L始终指向同一片内存地址,append的操作都在对同一个列表进行操作。如果这不是你想要的结果,可以试试下面这种写法:
def f(a, L=None):
if L is None:
L = []
L.append(a)
return L