第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

本地范圍,超出了封閉范圍

本地范圍,超出了封閉范圍

為什么用lambda函數(shù)獲取值列表i = 4。在調(diào)用lambda期間,不包含封閉范圍。函數(shù)f已完成工作并返回控件(變量i不存在)。def f():    L = []    for i in range(5):         L.append(lambda x: i ** x)     return LL = f()L[0]def f1(N):    def f2(X):        return X**N    return f2f=f1(2) f (3)   9g = f1(3)g(3)27f(3)9
查看完整描述

2 回答

?
慕的地8271018

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超4個(gè)贊

Python使用閉包捕獲對(duì)原始變量的引用。這些lambda對(duì)象保留了對(duì)i名稱(chēng)的引用,可以通過(guò)該引用訪(fǎng)問(wèn)值。這意味著i變量在f完成后將繼續(xù)存在。


您可以.__closure__在lambda對(duì)象的元組中內(nèi)省此閉包;函數(shù)具有相同的屬性:


>>> L[0].__closure__

(<cell at 0x1077f8b78: int object at 0x107465880>,)

>>> L[0].__closure__[0]

<cell at 0x1077f8b78: int object at 0x107465880>

>>> L[0].__closure__[0].cell_contents

4

這也是列表中所有l(wèi)ambda都L引用value4而不是0到4的原因。它們都引用相同的閉包:


>>> L[0].__closure__[0] is L[1].__closure__[0]

True

閉包引用變量,而不是定義閉包時(shí)該變量的值。循環(huán)的i最后一次設(shè)置為4,因此在查找時(shí),對(duì)于列表中的所有l(wèi)ambda,都會(huì)找到ilambda閉包4。


如果您希望lambdai在循環(huán)期間引用value,請(qǐng)?jiān)陉P(guān)鍵字參數(shù)中捕獲它:


def f():

    L = []

    for i in range(5): 

        L.append(lambda x, i=i: i ** x) 

    return L

現(xiàn)在i是lambda的局部變量,而不是閉包。


或者,創(chuàng)建一個(gè)全新的范圍來(lái)從中繪制閉合:


def create_lambda(i):

    return lambda x: i ** x


def f():

    return [create_lambda(i) for i in range(5)]

現(xiàn)在create_lambda()是一個(gè)新的作用域,它具有自己的本地i供lambda閉包引用。然后,每個(gè)lambda都有自己的閉包:


>>> L[0].__closure__[0] is L[1].__closure__[0]

False

閉包引用特定命名空間中的變量;每次您調(diào)用函數(shù)時(shí),都會(huì)創(chuàng)建一個(gè)新的本地名稱(chēng)空間,因此每個(gè)閉包都i在create_lambda與的其他調(diào)用不同的單獨(dú)名稱(chēng)空間中引用create_lambda。


查看完整回答
反對(duì) 回復(fù) 2021-04-02
  • 2 回答
  • 0 關(guān)注
  • 152 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)