亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python中如何避免默認參數(shù)的陷阱

 更新時間:2025年01月23日 16:16:15   作者:云墨-款哥的博客  
在 Python 中,我們經(jīng)常會使用函數(shù)的默認參數(shù)來簡化代碼,但你知道嗎默認參數(shù)的行為有時可能會導致一些難以察覺的錯誤,下面小編就為大家介紹一下如何避免這樣的錯誤吧

在 Python 中,我們經(jīng)常會使用函數(shù)的默認參數(shù)來簡化代碼。但你知道嗎?默認參數(shù)的行為有時可能會導致一些難以察覺的錯誤,尤其是當默認參數(shù)是一個可變對象(如列表或字典)時。今天,我們就來探討一下這個問題,并學習如何避免它。

問題背景

我們通常會定義一個函數(shù),并為其提供一些默認參數(shù)。例如:

def test(a, lst=[1, 2]):
    """
    給列表添加元素
    :param a: 需要添加的元素
    :param lst: 需要添加元素的列表
    :return: 添加之后的列表
    """
    if a not in lst:
        lst.append(a)
    return lst
print(test(4)) # [1, 2, 4]
print(test(40)) # [1, 2, 40],實際輸出:[1, 2, 4, 40]
print(test(40, lst=[])) # [40]
print(test(80)) # 實際輸出:[1, 2, 4, 40, 80]

我們在定義函數(shù)的時候,創(chuàng)建的默認參數(shù)lst,會在內存中創(chuàng)建一塊存儲區(qū)域用來存放這個列表

當我們第一次調用的時候,由于列表是可變類型,我們修改的是實際的值,但是我們的映射地址沒有變

這個時候該地址對應的數(shù)據(jù)就發(fā)生了變化

當我們給這個lst傳值得時候,相當于我們又新開了一塊內存,來儲存這個新的列表,這時候會生成一個新的地址

固當我們再次使用test(80)調用的時候,操作的仍是初始創(chuàng)建的列表

這個函數(shù)的目的是:接收一個參數(shù) a,然后將其添加到列表 lst 中。如果 a 不在列表中,就將它添加進去并返回修改后的列表。

我們來看一下這個代碼的執(zhí)行過程。

默認參數(shù)的行為

在 Python 中,函數(shù)的默認參數(shù)值是 在函數(shù)定義時就計算并初始化的。這意味著,默認參數(shù) lst=[1, 2] 只會在函數(shù)首次定義時創(chuàng)建一次,而不是每次調用函數(shù)時都會重新創(chuàng)建。如果你修改了默認參數(shù)中的可變對象(比如列表、字典等),下次調用函數(shù)時這個對象會被“記住”。

示例分析

print(test(4))  # [1, 2, 4]
print(test(40))  # [1, 2, 4, 40]
print(test(40, lst=[]))  # [40]
print(test(80))  # [1, 2, 4, 40, 80]

第一行: 調用 test(4) 時,lst 使用了默認參數(shù) [1, 2],因此 4 被成功地添加到了列表中,返回 [1, 2, 4]。

第二行: 調用 test(40) 時,由于默認參數(shù) lst 被修改過了,變成了 [1, 2, 4],因此 40 被加入到了列表中,返回 [1, 2, 4, 40]。

第三行: 調用 test(40, lst=[]) 時,你明確傳入了一個新的空列表 [],因此返回的是新的列表 [40],不會受到前面修改的影響。

第四行: 再次調用 test(80) 時,lst 已經(jīng)被修改為 [1, 2, 4, 40],因此 80 被添加到列表中,最終返回 [1, 2, 4, 40, 80]。

問題的根源

問題的根源在于:默認參數(shù)是共享的。當你修改了默認參數(shù)(如列表、字典等可變對象)時,這些修改會影響到后續(xù)的函數(shù)調用。

在上面的代碼中,默認列表 lst 是可變的,每次調用函數(shù)時都會操作同一個列表,從而導致了不可預期的結果。

如何避免默認參數(shù)引發(fā)的問題?

為了避免默認參數(shù)引發(fā)的問題,我們可以使用 None 作為默認參數(shù),并在函數(shù)內部檢查參數(shù)是否為 None,如果是,則創(chuàng)建一個新的列表。修改后的代碼如下:

def test(a, lst=None):
    if lst is None:
        lst = [1, 2]  # 創(chuàng)建新的列表
    if a not in lst:
        lst.append(a)
    return lst

這種做法能夠確保每次調用 test 函數(shù)時,都使用一個全新的列表,而不會出現(xiàn)共享默認參數(shù)的問題。

總結

在 Python 中,默認參數(shù)如果是可變對象(如列表、字典等),則它們的修改會影響到后續(xù)的調用。這種行為可能導致一些難以察覺的錯誤。為了解決這個問題,我們可以將默認參數(shù)設置為 None,然后在函數(shù)內部根據(jù)需要創(chuàng)建新的對象。這是避免共享可變對象的經(jīng)典做法。

到此這篇關于Python中如何避免默認參數(shù)的陷阱的文章就介紹到這了,更多相關Python默認參數(shù)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Python之批量創(chuàng)建文件的實例講解

    Python之批量創(chuàng)建文件的實例講解

    今天小編就為大家分享一篇Python之批量創(chuàng)建文件的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • Python爬取qq music中的音樂url及批量下載

    Python爬取qq music中的音樂url及批量下載

    這篇文章主要給大家介紹了利用Python爬取qq music中的音樂url及實現(xiàn)批量下載的相關資料,文中給出了詳細的介紹和示例代碼,相信對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。
    2017-03-03
  • Pandas提取單元格的值操作

    Pandas提取單元格的值操作

    這篇文章主要介紹了Pandas提取單元格的值操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • 淺析Python中的多重繼承

    淺析Python中的多重繼承

    這篇文章主要介紹了Python中的多重繼承,是Python學習中的基本知識,代碼基于Python2.x版本,需要的朋友可以參考下
    2015-04-04
  • Python字符串對象實現(xiàn)原理詳解

    Python字符串對象實現(xiàn)原理詳解

    這篇文章主要介紹了Python字符串對象實現(xiàn)原理詳解,在Python世界中將對象分為兩種:一種是定長對象,比如整數(shù),整數(shù)對象定義的時候就能確定它所占用的內存空間大小,另一種是變長對象,在對象定義時并不知道是多少,需要的朋友可以參考下
    2019-07-07
  • python pygame實現(xiàn)2048游戲

    python pygame實現(xiàn)2048游戲

    這篇文章主要為大家詳細介紹了python pygame實現(xiàn)2048游戲,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • 基于keras輸出中間層結果的2種實現(xiàn)方式

    基于keras輸出中間層結果的2種實現(xiàn)方式

    今天小編就為大家分享一篇基于keras輸出中間層結果的2種實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • 詳解Python IO編程

    詳解Python IO編程

    這篇文章主要介紹了Python IO編程的相關資料,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • Python實現(xiàn)學校管理系統(tǒng)

    Python實現(xiàn)學校管理系統(tǒng)

    這篇文章主要為大家詳細介紹了Python實現(xiàn)學校管理系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 如何基于Python批量下載音樂

    如何基于Python批量下載音樂

    這篇文章主要介紹了如何基于Python批量下載音樂,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11

最新評論