在python中函數參數中如果帶有默認參數list遇到問題
先看一段代碼
def f(x,l=[]): for i in range(x): l.append(i*i) print(l) print('---1---') f(4) print('---2---') f(5)
執行結果:
---1--- [0, 1, 4, 9] ---2--- [0, 1, 4, 9, 0, 1, 4, 9, 16]
預期的結果為:
---1--- [0, 1, 4, 9] ---2--- [0, 1, 4, 9, 16]
問題解釋:當定義函數時,會保存函數中默認參數list的值,也就是列表[],在每次調用的時候如果傳遞了列表,則使用傳遞的列表,沒有傳遞,使用定義函數時保存的默認參數list,以上案例中兩次調用都沒有傳遞默認參數list,程序會調用定義函數時,保存的默認參數list,列表在append的時候回在原來的基礎上添加,所以會產生以上結果,我們可以通過打印id看出。
修改代碼:
def f(x,l=[]): print(id(l)) # 添加打印id for i in range(x): l.append(i*i) print(l) print('---1---') f(4) print('---2---') f(5)
結果:
---1--- 140306123906248 [0, 1, 4, 9] ---2--- 140306123906248 [0, 1, 4, 9, 0, 1, 4, 9, 16]
會發現id值是相同的,說明兩次執行時使用的都是定義函數時默認的參數
再次修改代碼:
def f(x,l=[]): print(id(l)) for i in range(x): l.append(i*i) print(l) print('---1---') f(4) print('---2---') f(5,[]) print('---3---') f(6)
結果:
---1--- 140017293614280 [0, 1, 4, 9] ---2--- 140017293614472 [0, 1, 4, 9, 16] ---3--- 140017293614280 [0, 1, 4, 9, 0, 1, 4, 9, 16, 25]
會發現執行傳遞空列表的函數時打印的id不一樣,而沒有傳遞的一樣。當傳遞空list時函數體當中會使用傳遞的空list,沒有傳遞時,使用函數默認的list。所以會產生以上結果
如果想要達到預期的結果編寫一下代碼
def f(x,l=None): if l is None: l = [] for i in range(x): l.append(i*i) print(l) print('---1---') f(4) print('---2---') f(5) print('---3---') f(6)
結果:
---1--- [0, 1, 4, 9] ---2--- [0, 1, 4, 9, 16] ---3--- [0, 1, 4, 9, 16, 25]
這樣就達到了預期的結果 ------_<_>_------