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

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

為什么python嵌套函數(shù)不稱為閉包?

為什么python嵌套函數(shù)不稱為閉包?

縹緲止盈 2019-07-04 10:39:57
為什么python嵌套函數(shù)不稱為閉包?我在Python中看到并使用了嵌套函數(shù),它們與閉包的定義相匹配。那為什么叫他們nested functions而不是closures?嵌套函數(shù)不是閉包,因?yàn)樗鼈儾粸橥獠渴澜缢脝??最新情況:我讀到了關(guān)于閉包的文章,它讓我想到了Python的這個(gè)概念。我在下面的評(píng)論中找到了有人提到的那篇文章,但我不能完全理解文章中的解釋,所以我問這個(gè)問題。
查看完整描述

3 回答

?
嗶嗶one

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

當(dāng)函數(shù)從已完成其執(zhí)行的封閉作用域訪問局部變量時(shí),就會(huì)發(fā)生閉包。

def make_printer(msg):
    def printer():
        print msg    return printer

printer = make_printer('Foo!')printer()

什么時(shí)候make_printer調(diào)用時(shí),將一個(gè)新框架與編譯后的代碼一起放置到堆棧中。printer函數(shù)為常數(shù),其值為msg作為當(dāng)?shù)厝恕H缓髣?chuàng)建并返回函數(shù)。因?yàn)楹瘮?shù)printer引用msg變量之后,它將保持活動(dòng)狀態(tài)。make_printer函數(shù)已返回。

所以,如果嵌套函數(shù)沒有

  1. 訪問包含作用域的本地變量,
  2. 在超出該范圍的范圍內(nèi)執(zhí)行時(shí),

那他們就不是封閉的了。

這里有一個(gè)嵌套函數(shù)的例子,它不是閉包。

def make_printer(msg):
    def printer(msg=msg):
        print msg    return printer

printer = make_printer("Foo!")printer()  #Output: Foo!

在這里,我們將該值綁定到參數(shù)的默認(rèn)值。當(dāng)函數(shù)printer的值,因此不引用msg外邊printer需要在make_printer退貨。msg只是函數(shù)的一個(gè)正常局部變量。printer在這方面。


查看完整回答
反對(duì) 回復(fù) 2019-07-04
?
墨色風(fēng)雨

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

Python有一個(gè)瘦弱支持關(guān)閉。要了解我的意思,請(qǐng)以下使用JavaScript閉包的計(jì)數(shù)器為例:

function initCounter(){
    var x = 0;
    function counter  () {
        x += 1;
        console.log(x);
    };
    return counter;}count = initCounter();count(); //Prints 1count(); //Prints 2count(); //Prints 3

閉包是相當(dāng)優(yōu)雅的,因?yàn)樗咕帉戇@樣的函數(shù)具有“內(nèi)部?jī)?nèi)存”的能力。在Python2.7中,這是不可能的。如果你試著

def initCounter():
    x = 0;
    def counter ():
        x += 1 ##Error, x not defined
        print x    return counter

count = initCounter();count(); ##Errorcount();count();

你會(huì)得到一個(gè)錯(cuò)誤,說x是沒有定義的。但是,如果別人已經(jīng)向你展示了你可以打印它,那又是怎么回事呢?這是因?yàn)镻ython如何管理函數(shù)的變量作用域。而內(nèi)部功能朗讀,閱讀外部函數(shù)的變量,它不能他(她,它)們。

真是太可惜了。但是使用只讀閉包,您至少可以實(shí)現(xiàn)功能裝飾圖案Python為其提供語法糖。

更新

正如前面指出的,有一些方法可以處理python的范圍限制,我將公開一些方法。

1.使用global關(guān)鍵字(一般不推薦)。

2.在Python3.x中,使用nonlocal關(guān)鍵字(由@unutbu和@leewz建議)

3.定義一個(gè)簡(jiǎn)單的可修改類Object

class Object(object):
    pass

并創(chuàng)建一個(gè)Object scope內(nèi)initCounter存儲(chǔ)變量

def initCounter ():
    scope = Object()
    scope.x = 0
    def counter():
        scope.x += 1
        print scope.x    return counter

scope實(shí)際上只是一個(gè)引用,使用它的字段所采取的操作并沒有真正修改。scope因此不會(huì)出現(xiàn)錯(cuò)誤。

4.正如@unutbu所指出的,另一種方法是將每個(gè)變量定義為一個(gè)數(shù)組(x = [0])并修改它的第一個(gè)元素(x[0] += 1)。同樣,沒有出現(xiàn)錯(cuò)誤,因?yàn)?/trans>x它本身沒有被修改。

5.如@raxacoricofallapatorius所建議,您可以x.的財(cái)產(chǎn).counter

def initCounter ():

    def counter():
        counter.x += 1
        print counter.x

    counter.x = 0
    return counter


查看完整回答
反對(duì) 回復(fù) 2019-07-04
  • 3 回答
  • 0 關(guān)注
  • 749 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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