Python之在函式中使用列表作為預設引數

2022-07-01 18:27:12 字數 1973 閱讀 7999

本文將介紹筆者在工作中遇到的python的乙個坑,那就是使用列表作為預設引數。

我們知道,在python中,列表(list)是可變物件,所以列表的內容可能會在函式內改變。另乙個需要注意的是,使用列表作為函式的預設引數時,列表的內容變化情況。

首先,我們看以下的**例子:

def add(x, lst=):

if x not in lst:

return lst

def main():

list1 = add(1)

print(list1)

list2 = add(2)

print(list2)

list3 = add(3, [11, 12, 13, 14])

print(list3)

list4 = add(4)

print(list4)

main()

你可能以為輸出的結果會是:

[1]

[2][11, 12, 13, 14, 3]

[4]

但事實上,該程式輸出的結果是:

[1]

[1, 2]

[11, 12, 13, 14, 3]

[1, 2, 4]

這是為什麼呢?函式add的功能是當x不在列表中時,將x追加給列表lst。當函式第一次執行時,引數lst的預設值被建立。這個預設值只會被建立一次。add(1)將1加到lst。當函式再次被呼叫時,lst是[1]而不是,因為lst只被建立一次。當引數的lst為[11,12,13,14]時,lst就是[11,12,13,14]。list4呼叫函式時,使用預設引數,因此,現在預設引數lst為[1,2]。

為了更好地理解呼叫情況,可以在add函式中輸出lst的id,如以下**:

def add(x, lst=):

print(id(lst))

if x not in lst:

return lst

def main():

list1 = add(1)

print(list1)

list2 = add(2)

print(list2)

list3 = add(3, [11, 12, 13, 14])

print(list3)

list4 = add(4)

print(list4)

main()

輸出結果如下:

4469603648

[1]4469603648

[1, 2]

4469670472

[11, 12, 13, 14, 3]

4469603648

[1, 2, 4]

可以看到,list1, list2, list4呼叫時預設引數的id並沒有發生改變,而list3的id發生了改變。

這是python使用列表作為預設引數的乙個坑。那麼,如何避免踩坑呢?如果想要使用預設列表在每次函式呼叫時都是,可以像下面的程式那樣修改函式引數:

def add(x, lst=none):

if lst is none:

lst =

if x not in lst:

return lst

def main():

list1 = add(1)

print(list1)

list2 = add(2)

print(list2)

list3 = add(3, [11, 12, 13, 14])

print(list3)

list4 = add(4)

print(list4)

main()

輸出的結果如下:

[1]

[2][11, 12, 13, 14, 3]

[4]

oracle 之在查詢中使用函式

1 在查詢中使用字元函式 如 在員工資訊表中查詢出員工的生日 selectsubstr cardid,7,8 from users 將部門號01全部替換成 資訊科技 selectreplace deptno,01 資訊科技 from users 2 在查詢中使用數值函式 selectmod age,...

Vue之在vue中使用render

使用components進行渲染得到 建立 vue 例項,得到 viewmodel var vm newvue methods components script body html 使用render 這裡 return 的結果,會 替換頁面中 el 指定的那個 容器 建立 vue 例項,得到 vi...

Android之在活動中使用Menu選單

android之在活動中使用 menu 在res的目錄下建立乙個 menu 資料夾 在 menu 資料夾下新建乙個 android xml file檔案 加入如下 標籤是用來建立選單項的 android id給選單項指定乙個唯一識別符號 android title給選單項指定乙個名字 然後重寫onc...