在阅读别人博客的时候看到别人记录了一个python的坑,我觉得可能是一个今后会发生的一个错误,因此记录下来。直接上代码:

1
2
3
4
5
6
7
def f(a, L=[]):
L.append(a)
return L

print(f(1))
print(f(2))
print(f(3))

打印出来的结果是:

1
2
3
[1]
[1, 2]
[1, 2, 3]

这是因为, 作为默认参数, python在启动时就会将变量 L 建立, 我们在函数 f 内对 L 处理就会导致后来调用的 L 已经是修改过的 L 了, 我们可以通过打印 L 的内存地址来验证

1
2
3
4
5
6
7
8
9
def f(a, L=[]):
print(id(L))
L.append(a)
print(id(L))
return L

print(f(1))
print(f(2))
print(f(3))

结果是

1
2
3
4
5
6
7
8
9
4513289600
4513289600
[1]
4513289600
4513289600
[1, 2]
4513289600
4513289600
[1, 2, 3]

简单来说,被声明的默认参数成了一个全局变量

当然, python的文档中也给出了一个推荐的方法:

If you don’t want the default to be shared between subsequent calls, you can write the function like this instead:

1
2
3
4
5
def f(a, L=None):
if L is None:
L = []
L.append(a)
return L