成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Python之在函數(shù)中使用列表作為默認(rèn)參數(shù)

hufeng / 1017人閱讀

摘要:本文將介紹筆者在工作中遇到的的一個(gè)坑,那就是使用列表作為默認(rèn)參數(shù)。另一個(gè)需要注意的是,使用列表作為函數(shù)的默認(rèn)參數(shù)時(shí),列表的內(nèi)容變化情況。這是使用列表作為默認(rèn)參數(shù)的一個(gè)坑。

??本文將介紹筆者在工作中遇到的Python的一個(gè)坑,那就是使用列表作為默認(rèn)參數(shù)。
??我們知道,在Python中,列表(list)是可變對(duì)象,所以列表的內(nèi)容可能會(huì)在函數(shù)內(nèi)改變。另一個(gè)需要注意的是,使用列表作為函數(shù)的默認(rèn)參數(shù)時(shí),列表的內(nèi)容變化情況。
??首先,我們看以下的代碼例子:

def add(x, lst=[]):
    if x not in lst:
        lst.append(x)

    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()

你可能以為輸出的結(jié)果會(huì)是:

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

但事實(shí)上,該程序輸出的結(jié)果是:

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

這是為什么呢?函數(shù)add的功能是當(dāng)x不在列表中時(shí),將x追加給列表lst。當(dāng)函數(shù)第一次執(zhí)行時(shí),參數(shù)lst的默認(rèn)值[]被創(chuàng)建。這個(gè)默認(rèn)值只會(huì)被創(chuàng)建一次。add(1)將1加到lst。當(dāng)函數(shù)再次被調(diào)用時(shí),lst是[1]而不是[],因?yàn)閘st只被創(chuàng)建一次。當(dāng)參數(shù)的lst為[11,12,13,14]時(shí),lst就是[11,12,13,14]。list4調(diào)用函數(shù)時(shí),使用默認(rèn)參數(shù),因此,現(xiàn)在默認(rèn)參數(shù)lst為[1,2]。
??為了更好地理解調(diào)用情況,可以在add函數(shù)中輸出lst的id,如以下代碼:

def add(x, lst=[]):
    print(id(lst))

    if x not in lst:
        lst.append(x)
    
    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()

輸出結(jié)果如下:

4469603648
[1]
4469603648
[1, 2]
4469670472
[11, 12, 13, 14, 3]
4469603648
[1, 2, 4]

可以看到,list1, list2, list4調(diào)用時(shí)默認(rèn)參數(shù)的id并沒有發(fā)生改變,而list3的id發(fā)生了改變。
??這是Python使用列表作為默認(rèn)參數(shù)的一個(gè)坑。那么,如何避免踩坑呢?如果想要使用默認(rèn)列表在每次函數(shù)調(diào)用時(shí)都是[],可以像下面的程序那樣修改函數(shù)參數(shù):

def add(x, lst=None):

    if lst is None:
        lst = []
    if x not in lst:
        lst.append(x)

    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()

輸出的結(jié)果如下:

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

本次分享到此結(jié)束,感謝閱讀~

注意:本人現(xiàn)已開通微信公眾號(hào): Python爬蟲與算法(微信號(hào)為:easy_web_scrape), 歡迎大家關(guān)注哦~~

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/43076.html

相關(guān)文章

  • 入門系列之在Nginx配置Gzip

    摘要:結(jié)果應(yīng)該與以前略有不同響應(yīng)頭沒有輸出,這意味著文件是在沒有壓縮的情況下提供。文件的響應(yīng)頭下一步是將配置支持其他類型文件的壓縮。下一步是檢查配置的更改是否按預(yù)期工作?,F(xiàn)在,只有圖像文件才能保持未壓縮狀態(tài)。 歡迎大家前往騰訊云+社區(qū),獲取更多騰訊海量技術(shù)實(shí)踐干貨哦~ 本文由小鐵匠米蘭的v 發(fā)表于云+社區(qū)專欄 簡介 網(wǎng)站加載的速度取決于瀏覽器必須下載的所有文件的大小。減少要傳輸?shù)奈募?..

    waltr 評(píng)論0 收藏0
  • python-函數(shù)

    摘要:局部變量只能在其被聲明的函數(shù)內(nèi)部訪問,而全局變量可以在整個(gè)程序范圍內(nèi)訪問。調(diào)用函數(shù)時(shí),所有在函數(shù)內(nèi)聲明的變量名稱都將被加入到作用域中。 函數(shù)(一)定義函數(shù)你可以定義一個(gè)由自己想要功能的函數(shù),以下是簡單的規(guī)則:(1)函數(shù)代碼塊以?def?關(guān)鍵詞開頭,后接函數(shù)標(biāo)識(shí)符名稱和圓括號(hào)()。(2)任何傳入?yún)?shù)和自變量必須放在圓括號(hào)中間。圓括號(hào)之間可以用于定義參數(shù)。(3)函數(shù)的第一行語句可以選擇性地...

    cooxer 評(píng)論0 收藏0
  • 陷阱!python參數(shù)默認(rèn)

    摘要:所有默認(rèn)參數(shù)值則存儲(chǔ)在函數(shù)對(duì)象的屬性中,它的值為一個(gè)列表,列表中每一個(gè)元素均為一個(gè)默認(rèn)參數(shù)的值。你可以定義一個(gè)對(duì)象作為占位符,如下面例子雖然應(yīng)該避免默認(rèn)參數(shù)值為可變對(duì)象,不過有時(shí)候使用可變對(duì)象作為默認(rèn)值會(huì)收到不錯(cuò)的效果。 原文地址 在stackoverflow上看到這樣一個(gè)程序: #! /usr/bin/env python # -*- coding: utf-8 -*- class...

    Jason 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<