python函數參數中帶有默認參數list的坑


在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]

 這樣就達到了預期的結果  ------_<_>_------


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM