最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python閉包與閉包陷阱舉例詳解

 更新時(shí)間:2023年01月28日 09:35:56   作者:專注算法的馬里奧學(xué)長(zhǎng)  
閉包并不只是一個(gè)Python中的概念,在函數(shù)式編程語(yǔ)言中應(yīng)用較為廣泛,下面這篇文章主要給大家介紹了關(guān)于Python閉包與閉包陷阱的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

1 什么是閉包

在 Python 中,閉包是一種特殊的函數(shù),它能夠記住它所在的環(huán)境(也稱作上下文)。這意味著閉包能夠訪問定義它的作用域中的變量。閉包通常用于封裝數(shù)據(jù)和提供對(duì)外部訪問的接口。

在 Python 中使用閉包有以下幾點(diǎn)好處:

  • 保存狀態(tài):閉包可以保存外部函數(shù)的狀態(tài),以便在內(nèi)部函數(shù)中使用。
  • 簡(jiǎn)化代碼:閉包可以簡(jiǎn)化代碼結(jié)構(gòu),使得復(fù)雜的邏輯變得簡(jiǎn)單易懂。
  • 模塊化編程:閉包可以更好地封裝代碼,提高代碼的可重用性。
  • 保證函數(shù)線程安全:閉包可以保證函數(shù)的線程安全性,避免全局變量被多線程修改。

2 閉包示例代碼

代碼示例如下:

def outer_func(x):
    def inner_func(y):
        return x + y
    return inner_func

closure = outer_func(10)
print(closure(5)) # 15

這是一個(gè)閉包的示例代碼,其中outer_func是外部函數(shù),它返回一個(gè)內(nèi)部函數(shù)inner_func。內(nèi)部函數(shù)使用了外部函數(shù)的變量x,并且在被調(diào)用時(shí)使用了參數(shù)y。因此,當(dāng)我們調(diào)用outer_func(10)時(shí),它返回了一個(gè)閉包(即inner_func),它記錄了x=10的值。之后,我們可以調(diào)用這個(gè)閉包,并傳入?yún)?shù)y來計(jì)算結(jié)果。

3 什么是閉包陷阱

Python中的閉包陷阱指的是在閉包中引用了變量時(shí),如果該變量在閉包外部被修改,則閉包內(nèi)部的值也會(huì)改變。這可能會(huì)導(dǎo)致程序的錯(cuò)誤或意外行為。

4 閉包陷阱代碼實(shí)例

請(qǐng)對(duì)比以下兩組代碼

4.1 第一組代碼實(shí)例

def closure1():
    l = []
    for i in range(3):
        def inner(i_=i):
            return i_**2
        l.append(inner)
    return l


l1 = closure1()
print([i() for i in l1])

在執(zhí)行代碼時(shí),首先i的在range(3)中獲取的值為0,接下來執(zhí)行l.append(inner)。這里inner并沒有括號(hào),所以inner本身不會(huì)被執(zhí)行,而是在l中添加了一個(gè)inner函數(shù)對(duì)象。并且inner函數(shù)的形參i_默認(rèn)值為0。

接下來,在for循環(huán)的作用下,l又被重復(fù)添加了兩次inner對(duì)象,其中i_的默認(rèn)值分別為1和2。

執(zhí)行完closure1后,我們使用列表推到式去遍歷l1。

列表推導(dǎo)式中的i()使得inner對(duì)象被執(zhí)行。因?yàn)?code>i()中未傳入任何參數(shù),所以其中的i_使用了我們定義的默認(rèn)參數(shù):0,1,2。在執(zhí)行完inner函數(shù)后,這些數(shù)字變成了0,1,4。因此最終的輸出即為[0,1,4] 。

以上是一段正常的非閉包代碼。

4.2 第二組代碼實(shí)例

def closure2():
    l = []
    for i in range(3):
        def inner():
            return i**2
        l.append(inner)
    print(inner.__closure__)
    return l


l2 = closure2()
print([i() for i in l2])

這一組代碼和上面一組代碼沒有很大的區(qū)別,唯一的差異是,這一組代碼的inner并未傳入形參i_。inner中的i直接取自外部。
因此,在執(zhí)行closure2中的for循環(huán)時(shí),l中依然會(huì)被傳入3個(gè)inner函數(shù)對(duì)象,唯一的區(qū)別是傳入的對(duì)象沒有指定形參的默認(rèn)值。
在執(zhí)行[i() for i in l2]這個(gè)列表推到式時(shí),inner函數(shù)并未找到對(duì)i的賦值,因此回到外部的closure2中去尋找,并找到了i的值為3。
因此,對(duì)于這段代碼,每一個(gè)inner函數(shù)對(duì)象的輸出都是4。

很明顯這并不是我們想要的結(jié)果,這就是一個(gè)典型的閉包陷阱。

總結(jié)

到此這篇關(guān)于Python閉包與閉包陷阱舉例的文章就介紹到這了,更多相關(guān)Python閉包與閉包陷阱內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

富平县| 桐庐县| 巍山| 大竹县| 黄冈市| 开远市| 呼玛县| 新沂市| 前郭尔| 平南县| 开原市| 囊谦县| 海安县| 卫辉市| 根河市| 沅陵县| 万荣县| 镇平县| 久治县| 泽库县| 沁源县| 南靖县| 大英县| 紫阳县| 西乌| 江阴市| 乌审旗| 广东省| 平远县| 开平市| 乐业县| 抚州市| 清远市| 邵阳市| 福建省| 武定县| 绿春县| 平邑县| 磴口县| 周至县| 宁阳县|