def f(x,l=[]): for i in range(x): l.append(i*i) print l
下面程式碼會輸出什麼:
def f(x,l=[]):
for i in range(x):
l.append(i*i)
print l
f(2)
f(3,[3,2,1])
f(3)
答案:
[0, 1]
[3, 2, 1, 0, 1, 4]
[0, 1, 0, 1, 4]
呃?
第一個函式呼叫十分明顯,for迴圈先後將0和1新增至了空列表l中。l是變數的名字,指向記憶體中儲存的一個列表。第二個函式呼叫在一塊新的記憶體中建立了新的列表。l這時指向了新生成的列表。之後再往新列表中新增0、1、2和4。很棒吧。第三個函式呼叫的結果就有些奇怪了。它使用了之前記憶體地址中儲存的舊列表。這就是為什麼它的前兩個元素是0和1了。
執行下面的程式碼看看:
def f(x,l=[]):
print id(l)
for i in range(x):
l.append(i*i)
print id(l)
print '#########'
f(2)
f(3,[3,2,1])
f(3)
結果為:
39443912
39443912
#########
39993928
39993928
#########
39443912
39443912
#########
不明白的話就試著執行下面的程式碼吧:
l_mem = []
l = l_mem # the first call
for i in range(2):
l.append(i*i)
print l # [0, 1]
l = [3,2,1] # the second call
for i in range(3):
l.append(i*i)
print l # [3, 2, 1, 0, 1, 4]
l = l_mem # the third call
for i in range(3):
l.append(i*i)
print l # [0, 1, 0, 1, 4]