国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

python閉包探究一二

jzman / 2641人閱讀

摘要:在嵌套函數(shù)中訪問了最外層函數(shù)的參數(shù),結(jié)果我們是能正常訪問閉包我們將上面的最外層的返回值修改為返回嵌套函數(shù)的引用一切皆對象根據(jù)前面變量生存期例子,按理說調(diào)用完的生命周期應(yīng)該結(jié)束了,調(diào)用應(yīng)該失敗才對,但是實際卻調(diào)用成功了。

復(fù)習(xí)

python引用變量的順序: 當(dāng)前作用域局部變量 -> 外層作用域變量 -> 當(dāng)前模塊中的全局變量 -> python內(nèi)置變量

global:聲明一個全局變量

nonlocal:用來在函數(shù)或其他作用域中使用外層(非全局)變量

對于global跟nonlocal請點擊 python3中g(shù)lobal 和 nonlocal 的作用域

變量生存期

我們寫個簡單的變量生存期的小例子

def transmit_to_space(message):
    print(message)

print(transmit_to_space("Test message"))

print(message)  # 報錯 NameError: name "message" is not defined 
嵌套函數(shù)

Python 允許函數(shù)中有函數(shù),即為嵌套函數(shù)。

def transmit_to_space(message):
    "This is the enclosing function"
    def data_transmitter():
        "The nested function"
        print(message)

    data_transmitter()

print(transmit_to_space("Test message"))

在嵌套函數(shù)中訪問了最外層函數(shù)的參數(shù),結(jié)果我們是能正常訪問 message

閉包

我們將上面的最外層(enclosing function) 的返回值修改為返回嵌套函數(shù)的引用(Python一切皆對象)

def transmit_to_space(message):
  "This is the enclosing function"
  def data_transmitter():
      "The nested function"
      print(message)
  return data_transmitter

fun2 = transmit_to_space("Burn the Sun!")
fun2()

根據(jù)前面變量生存期例子,按理說 transmit_to_space("Burn the Sun!") 調(diào)用完 message 的生命周期應(yīng)該結(jié)束了,fun2調(diào)用應(yīng)該失敗才對,但是實際卻調(diào)用成功了。

其實這里涉及到了閉包,我們查看 fun2 的 __closure__ 屬性 (python2下是func_closure)。看到有一個cell對象,里面值就是 message 的內(nèi)容。

所以閉包是: 嵌套定義在非全局作用域里面的函數(shù)能夠記住它在被定義的時候它所處的封閉命名空間。(只會記住被嵌套函數(shù)使用的值,如果enclosing function 里面還定義了其他的值,封閉作用域里面是不會有的)

看下面例子的變化

我們增加一個參數(shù),但是嵌套函數(shù)中未使用這個參數(shù),發(fā)現(xiàn)fun2就沒有再記住這個值。


更多鏈接:Python閉包詳解

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/41786.html

相關(guān)文章

  • [零基礎(chǔ)學(xué)Python]一二三,集合了

    摘要:最簡單的說法,即是在最原始的集合論樸素集合論中的定義,集合就是一堆東西。若然是集合的元素,記作。這里對被數(shù)學(xué)家們稱為直觀的或樸素的集合論進行一個簡短而基本的介紹更詳細(xì)的分析可見樸素集合論。對集合進行嚴(yán)格的公理推導(dǎo)可見公理化集合論。 回顧一下已經(jīng)了解的數(shù)據(jù)類型:int/str/bool/list/dict/tuple 還真的不少了. 不過,python是一個發(fā)展的語言,沒準(zhǔn)以后還出別...

    CastlePeaK 評論0 收藏0
  • JS程序

    摘要:設(shè)計模式是以面向?qū)ο缶幊虨榛A(chǔ)的,的面向?qū)ο缶幊毯蛡鹘y(tǒng)的的面向?qū)ο缶幊逃行┎顒e,這讓我一開始接觸的時候感到十分痛苦,但是這只能靠自己慢慢積累慢慢思考。想繼續(xù)了解設(shè)計模式必須要先搞懂面向?qū)ο缶幊蹋駝t只會讓你自己更痛苦。 JavaScript 中的構(gòu)造函數(shù) 學(xué)習(xí)總結(jié)。知識只有分享才有存在的意義。 是時候替換你的 for 循環(huán)大法了~ 《小分享》JavaScript中數(shù)組的那些迭代方法~ ...

    melody_lql 評論0 收藏0
  • 前端進擊的巨人(二):棧、堆、隊列、內(nèi)存空間

    摘要:中有三種數(shù)據(jù)結(jié)構(gòu)棧堆隊列。前端進擊的巨人一執(zhí)行上下文與執(zhí)行棧,變量對象中解釋執(zhí)行棧時,舉了一個乒乓球盒子的例子,來演示棧的存取方式,這里再舉個栗子搭積木。對于基本類型,棧中存儲的就是它自身的值,所以新內(nèi)存空間存儲的也是一個值。 面試經(jīng)常遇到的深淺拷貝,事件輪詢,函數(shù)調(diào)用棧,閉包等容易出錯的題目,究其原因,都是跟JavaScript基礎(chǔ)知識不牢固有關(guān),下層地基沒打好,上層就是豆腐渣工程,...

    edgardeng 評論0 收藏0
  • js下探究 let, var 之于閉包

    摘要:問題在說閉包,一定會牽涉到作用域。這也是閉包的屬性的,能夠記錄下內(nèi)部函數(shù)引用外部的值。因為都是全局變量,所以循環(huán)也就是不斷值覆蓋,閉包并不會記錄在循環(huán)時的值,只會記錄閉包變量。閉包時記錄的除了閉包變量還有塊級作用域變量最后來看看這個輸出什么 js 是非常靈活的語言,寫起來真是* 不過現(xiàn)在有了typescript,寫起來舒服多了。 問題 在說js閉包,一定會牽涉到作用域。而一般在區(qū)別 v...

    BLUE 評論0 收藏0
  • javascript知識點

    摘要:模塊化是隨著前端技術(shù)的發(fā)展,前端代碼爆炸式增長后,工程化所采取的必然措施。目前模塊化的思想分為和。特別指出,事件不等同于異步,回調(diào)也不等同于異步。將會討論安全的類型檢測惰性載入函數(shù)凍結(jié)對象定時器等話題。 Vue.js 前后端同構(gòu)方案之準(zhǔn)備篇——代碼優(yōu)化 目前 Vue.js 的火爆不亞于當(dāng)初的 React,本人對寫代碼有潔癖,代碼也是藝術(shù)。此篇是準(zhǔn)備篇,工欲善其事,必先利其器。我們先在代...

    Karrdy 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<