在定義函數的時候皇忿,如果函數的參數有默認值,有兩種類型的參數撒遣,一種是整數载城,字符串這種不可變類型,另一種是列表這種可變類型,對于第一種情況沒有什么特殊的地方垮兑,但是對于可變類型冷尉,有一個微妙的小陷阱。
可變類型以及小陷阱:
# coding=utf-8
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]
問題:為什么會輸出[1,2],[1,2,6]系枪,很明顯使用默認參數的情況下雀哨,每調用一次append_item,都在之前得list1基礎上添加元素嗤无。但是不使用默認值震束,就沒有這種情況了,這是為什么呢当犯?
原因:在創(chuàng)建上面的函數時垢村,list1參數被設置為引用一個新的列表,之后嚎卫,在僅使用第一個參數調用該函數(即第二個使用默認參數)時嘉栓,默認的列表都將是函數本身創(chuàng)建時指定的那個列表,因此將不會再有新的列表得以創(chuàng)建拓诸。
我們所期待的是侵佃,在每次僅使用第一個參數調用該函數時,都會創(chuàng)建一個新的空列表奠支,下面進行改動:
# coding=utf-8
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]