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

一文帶你了解Python中的延遲綁定

 更新時間:2023年05月06日 09:34:28   作者:答案永恒  
Python中的延遲綁定是指在嵌套函數(shù)中,內(nèi)部函數(shù)在被調(diào)用時才會綁定外部函數(shù)的變量,而不是在定義內(nèi)部函數(shù)時就綁定。本文將通過一些例子帶大家深入了解Python中的延遲綁定,感興趣的可以了解一下

延遲綁定是什么?

Python中的延遲綁定是指在嵌套函數(shù)中,內(nèi)部函數(shù)在被調(diào)用時才會綁定外部函數(shù)的變量,而不是在定義內(nèi)部函數(shù)時就綁定。這種綁定方式可以導(dǎo)致一些出乎意料的行為,因為變量的值是在函數(shù)調(diào)用時決定的,而不是在函數(shù)定義時。

具體來說,當(dāng)一個嵌套函數(shù)引用了外部函數(shù)的變量時,Python會在內(nèi)部函數(shù)被調(diào)用時搜索變量的值,而不是在內(nèi)部函數(shù)定義時。這意味著如果外部函數(shù)的變量在內(nèi)部函數(shù)被調(diào)用之前被改變了,內(nèi)部函數(shù)將使用新的變量值,而不是定義時的值。這種行為可能會導(dǎo)致一些困惑和錯誤,特別是在使用嵌套函數(shù)進(jìn)行編程時。

舉個栗子

下面是一個例子,展示了延遲綁定的行為:

def outer():
    numbers = [1, 2, 3, 4, 5]
    funcs = []
    for number in numbers:
        def inner():
            return number
        funcs.append(inner)
    return funcs
for func in outer():
    print(func())

輸出結(jié)果為:

5
5
5
5
5

這是因為每個內(nèi)部函數(shù)都引用了外部函數(shù)的 number 變量,但是這個變量在內(nèi)部函數(shù)被調(diào)用時才會被綁定。由于 number 在每個迭代中的值都被重新賦值,所有內(nèi)部函數(shù)都返回最后一個值,即 5。

為了避免延遲綁定可能導(dǎo)致的問題,可以通過將變量的值作為參數(shù)傳遞給內(nèi)部函數(shù)來顯式地綁定變量。例如,上面的代碼可以修改如下:

def outer():
    numbers = [1, 2, 3, 4, 5]
    funcs = []
    for number in numbers:
        def inner(number=number):
            return number
        funcs.append(inner)
    return funcs
for func in outer():
    print(func())

輸出結(jié)果為:

1
2
3
4
5

在這個版本中,每個內(nèi)部函數(shù)都有一個默認(rèn)參數(shù) number,它的默認(rèn)值是外部循環(huán)的 number 變量。由于默認(rèn)參數(shù)的值在內(nèi)部函數(shù)被定義時就被確定了,所以每個內(nèi)部函數(shù)都綁定了不同的變量值。

另一個典型的栗子

def multipliers(): 
    return [lambda x : i*x for i in range(4)] 
print([m(2) for m in multipliers()])

輸出結(jié)果為:

[6, 6, 6, 6]

是不是和你的想不一樣呢?。槭裁茨???

這是因為,在multipliers函數(shù)中,返回的是一個包含四個 lambda 函數(shù)的列表,這些 lambda 函數(shù)的形式參數(shù)為 x,函數(shù)體為 i*x。當(dāng)這些 lambda 函數(shù)被調(diào)用時,它們的 i 取決于它們在列表中的索引,而不是在定義時的值。因此,當(dāng)我們在 [m(2) for m in multipliers()] 中迭代這些 lambda 函數(shù)并傳遞 2 作為參數(shù)時,所有 lambda 函數(shù)的 i 都是最后一個 i 的值,即 3,因此所有的 lambda 函數(shù)都會返回 3*2=6

還不是很清楚?

沒關(guān)系,讓我們換一種方式解釋下。

將 lambda 函數(shù)轉(zhuǎn)換為等價的普通函數(shù),可以更清晰地看到問題出在哪里。 首先,我們將原始的 lambda 函數(shù):

lambda x : i*x

轉(zhuǎn)換為等價的普通函數(shù):

def multiplier(x):
    return i*x

然后,我們將 multipliers() 函數(shù)中的 lambda 函數(shù)列表轉(zhuǎn)換為等價的普通函數(shù)列表:

def multipliers():
    funcs = []
    for i in range(4):
        def multiplier(x):
            return i*x
        funcs.append(multiplier)
    return funcs

現(xiàn)在,我們可以更清晰地看到問題出在哪里。在原始的 lambda 函數(shù)中,i 是一個自由變量,它的值在函數(shù)調(diào)用時動態(tài)綁定。但是,在 multipliers() 函數(shù)中,每個 multiplier() 函數(shù)都使用了同一個自由變量 i,其值在函數(shù)迭代結(jié)束后被設(shè)置為 3。因此,當(dāng)我們迭代這些函數(shù)并傳遞 2 作為參數(shù)時,每個函數(shù)都會乘以最后一個 i 的值,也就是 3,所以結(jié)果會是 [6, 6, 6, 6]。

如果要解決這個問題,可以使用閉包來捕獲每個 lambda 函數(shù)所需的 i 值,使每個函數(shù)都有自己獨立的 i 值。這樣,當(dāng)我們迭代這些函數(shù)并傳遞參數(shù) 2 時,每個函數(shù)都會乘以它們自己獨立的 i 值,而不是最后一個 i 的值。

怎么避免這個問題呢

要避免這個問題,我們可以將 lambda 函數(shù)中的 i 變?yōu)槟J(rèn)參數(shù),這樣每個 lambda 函數(shù)都會有一個獨立的 i 值。下面是一個修改后的代碼:

def multipliers():
    return [lambda x, i=i : i*x for i in range(4)]
print([m(2) for m in multipliers()])

輸出結(jié)果為:

[0, 2, 4, 6]

現(xiàn)在,每個 lambda 函數(shù)都有一個獨立的 i 值,因此輸出結(jié)果正確。

將 lambda 函數(shù)轉(zhuǎn)換為等價的普通函數(shù),可以更清晰地看到問題出在哪里。

def multipliers():
    funcs = []
    for i in range(4):
        def multiplier(x, i=i):
            return i*x
        funcs.append(multiplier)
    return funcs

這里我們使用了閉包來捕獲每個 lambda 函數(shù)所需的 i 值,這樣每個函數(shù)都有一個獨立的 i 值。

現(xiàn)在,我們可以更清晰地看到問題出在哪里。在原始的 lambda 函數(shù)中,i 是一個自由變量,它的值在函數(shù)調(diào)用時動態(tài)綁定。但是,在 multipliers() 函數(shù)中,每個 multiplier() 函數(shù)都有自己獨立的 i 值,這個值是在函數(shù)定義時靜態(tài)綁定的。因此,當(dāng)我們迭代這些函數(shù)并傳遞 2 作為參數(shù)時,所有函數(shù)的 i 值都是它們在定義時的值,而不是在調(diào)用時動態(tài)綁定的值。

通過使用閉包來捕獲每個 lambda 函數(shù)所需的 i 值,我們可以解決這個問題,使每個函數(shù)都有自己獨立的 i 值。

到此這篇關(guān)于一文帶你了解Python中的延遲綁定的文章就介紹到這了,更多相關(guān)Python延遲綁定內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 利用Jmeter實現(xiàn)在請求param和body里面加入隨機(jī)參數(shù)

    利用Jmeter實現(xiàn)在請求param和body里面加入隨機(jī)參數(shù)

    本文介紹了如何使用jemeter實現(xiàn)新增接口壓力測試中的隨機(jī)參數(shù)生成,首先,使用函數(shù)助手對話框生成隨機(jī)數(shù),然后將生成的隨機(jī)數(shù)作為參數(shù)放入請求中,無論請求格式是json、xml還是text等,如果param和body同時存在并需要隨機(jī)生成參數(shù),可以把參數(shù)寫入到請求地址中
    2024-10-10
  • Python實現(xiàn)K-近鄰算法的示例代碼

    Python實現(xiàn)K-近鄰算法的示例代碼

    k-近鄰算法(K-Nearest Neighbour algorithm),又稱 KNN 算法,是數(shù)據(jù)挖掘技術(shù)中原理最簡單的算法。本文將介紹實現(xiàn)K-近鄰算法的示例代碼,需要的可以參考一下
    2022-09-09
  • Python機(jī)器學(xué)習(xí)應(yīng)用之基于BP神經(jīng)網(wǎng)絡(luò)的預(yù)測篇詳解

    Python機(jī)器學(xué)習(xí)應(yīng)用之基于BP神經(jīng)網(wǎng)絡(luò)的預(yù)測篇詳解

    BP(back?propagation)神經(jīng)網(wǎng)絡(luò)是1986年由Rumelhart和McClelland為首的科學(xué)家提出的概念,是一種按照誤差逆向傳播算法訓(xùn)練的多層前饋神經(jīng)網(wǎng)絡(luò),是應(yīng)用最廣泛的神經(jīng)網(wǎng)絡(luò)模型之一
    2022-01-01
  • Numpy 理解ndarray對象的示例代碼

    Numpy 理解ndarray對象的示例代碼

    這篇文章主要介紹了Numpy 理解ndarray對象的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 利用Python實現(xiàn)面部識別的方法詳解

    利用Python實現(xiàn)面部識別的方法詳解

    人臉識別正在成為軟件開發(fā)中的一種趨勢。它有助于識別人臉并使應(yīng)用程序更加健壯。本文將使用python和face_recognition庫創(chuàng)建一個簡單的人臉識別,需要的可以參考一下
    2022-05-05
  • python 反編譯exe文件為py文件的實例代碼

    python 反編譯exe文件為py文件的實例代碼

    這篇文章主要介紹了python 反編譯exe文件為py文件的實例代碼,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-06-06
  • Python phone模塊獲取手機(jī)號歸屬地 區(qū)號 運營商等信息demo

    Python phone模塊獲取手機(jī)號歸屬地 區(qū)號 運營商等信息demo

    這篇文章主要介紹了Python phone模塊獲取手機(jī)號歸屬地 區(qū)號 運營商等信息的實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • 利用Python實現(xiàn)Windows定時關(guān)機(jī)功能

    利用Python實現(xiàn)Windows定時關(guān)機(jī)功能

    是最初的幾個爬蟲,讓我認(rèn)識了Python這個新朋友,雖然才剛認(rèn)識了幾天,但感覺有種莫名的默契感。下面通過這篇文章給大家介紹Python實現(xiàn)Windows定時關(guān)機(jī)功能,需要的朋友可以參考下
    2017-03-03
  • 用Python實現(xiàn)斐波那契(Fibonacci)函數(shù)

    用Python實現(xiàn)斐波那契(Fibonacci)函數(shù)

    這篇文章主要介紹了用Python實現(xiàn)斐波那契(Fibonacci)函數(shù)的相關(guān)資料,需要的朋友可以參考下
    2016-03-03
  • python實現(xiàn)鬧鐘定時播放音樂功能

    python實現(xiàn)鬧鐘定時播放音樂功能

    這篇文章主要為大家詳細(xì)介紹了python實現(xiàn)鬧鐘定時播放音樂功能,播放wav格式的音頻,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01

最新評論

库伦旗| 萍乡市| 通城县| 惠安县| 井研县| 泾阳县| 红桥区| 庆元县| 襄樊市| 南宁市| 江北区| 修文县| 眉山市| 聂拉木县| 砀山县| 苍山县| 汕尾市| 温宿县| 丁青县| 聂荣县| 新田县| 城固县| 常宁市| 深圳市| 郸城县| 息烽县| 安仁县| 库伦旗| 江津市| 井冈山市| 天等县| 宜丰县| 大厂| 万宁市| 铁岭市| 会理县| 长春市| 德江县| 陈巴尔虎旗| 焦作市| 门头沟区|