Python中定義函數時參數有默認值的小陷阱


在定義函數的時候,如果函數的參數有默認值,有兩種類型的參數,一種是整數,字符串這種不可變類型,另一種是列表這種可變類型,對於第一種情況沒有什么特殊的地方,但是對於可變類型,有一個微妙的小陷阱。

可變類型以及小陷阱:

def append_item(item, list1=[]):
    list1.append(item)
    return list1

print(append_item((1)))  # [1]
print(append_item((2)))  # [1, 2]
print(append_item((6)))  # [1, 2, 6]
list2 = [6, 7]
print(append_item(1, list2))  # [6, 7, 1]
print(append_item(9, list2))  # [6, 7, 1,9]

PS:遇到問題沒人解答?需要Python學習資料?可以加點擊下方鏈接自行獲取
note.youdao.com/noteshare?id=2dce86d0c2588ae7c0a88bee34324d76

問題:為什么會輸出[1,2],[1,2,6],很明顯使用默認參數的情況下,每調用一次append_item,都在之前得list1基礎上添加元素。但是不使用默認值,就沒有這種情況了,這是為什么呢?

原因:在創建上面的函數時,list1參數被設置為引用一個新的列表,之后,在僅使用第一個參數調用該函數(即第二個使用默認參數)時,默認的列表都將是函數本身創建時指定的那個列表,因此將不會再有新的列表得以創建。

我們所期待的是,在每次僅使用第一個參數調用該函數時,都會創建一個新的空列表,下面進行改動:

def append_item(item, list1=[]):
    if not list1:
        list1 = []
    list1.append(item)
    return list1

print(append_item((1)))  # [1]
print(append_item((2)))  # [2]
print(append_item((6)))  # [6]
list2 = [6, 7]
print(append_item(1, list2))  # [6, 7, 1]
print(append_item(9, list2))  # [6, 7, 1,9]


免責聲明!

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



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