尝试运行下列函数:
方式1
def f(x, l=[]):
print("------")
print(id(l), l)
for i in range(x):
l.append(i * i)
print(l)
f(2)
f(3, [3, 2, 1])
f(3)
输出:
------
3034087835392 []
[0, 1]
------
3034087835456 [3, 2, 1]
[3, 2, 1, 0, 1, 4]
------
3034087835392 [0, 1]
[0, 1, 0, 1, 4]
方式2:
def f(x, l=None):
if l is None:
l = []
print("------")
print(id(l), l)
for i in range(x):
l.append(i * i)
print(l)
f(2)
f(3, [3, 2, 1])
f(3)
输出:
------
2294922889024 []
[0, 1]
------
2294922889024 [3, 2, 1]
[3, 2, 1, 0, 1, 4]
------
2294922889024 []
[0, 1, 4]
发生了什么?
方式1
第一个函数调用十分明显,for循环先后将0和1添加至了空列表l中。l是变量的名字,指向内存中存储的一个列表。第二个函数调用在一块新的内存中创建了新的列表。l这时指向了新生成的列表。之后再往新列表中添加0、1、2和4。很棒吧。第三个函数调用的结果就有些奇怪了。它使用了之前内存地址中存储的旧列表。这就是为什么它的前两个元素是0和1了。
方式2
同方式1,只不过引用的列表都为同一个。