1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時(shí)間:8:30-17:00
      你可能遇到了下面的問(wèn)題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
      python中閉包、深淺拷貝、垃圾回收、with語(yǔ)句的示例分析-創(chuàng)新互聯(lián)

      小編給大家分享一下python中閉包、深淺拷貝、垃圾回收、with語(yǔ)句的示例分析,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

      公司主營(yíng)業(yè)務(wù):網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。創(chuàng)新互聯(lián)推出黃陵免費(fèi)做網(wǎng)站回饋大家。

      1.1 閉包

      1、閉包概念

      1. 在一個(gè)外函數(shù)中定義了一個(gè)內(nèi)函數(shù),內(nèi)函數(shù)里運(yùn)用了外函數(shù)的臨時(shí)變量,并且外函數(shù)的返回值是內(nèi)函數(shù)的引用,這樣就構(gòu)成了一個(gè)閉包

      2. 一般情況下,在我們認(rèn)知當(dāng)中,如果一個(gè)函數(shù)結(jié)束,函數(shù)的內(nèi)部所有東西都會(huì)釋放掉,還給內(nèi)存,局部變量都會(huì)消失。

      3. 但是閉包是一種特殊情況,如果外函數(shù)在結(jié)束的時(shí)候發(fā)現(xiàn)有自己的臨時(shí)變量將來(lái)會(huì)在內(nèi)部函數(shù)中用到,就把這個(gè)臨時(shí)變量綁定給了內(nèi)部函數(shù),然后自己再結(jié)束。

      2、閉包特點(diǎn)    

      1. 必須有一個(gè)內(nèi)嵌函數(shù)

      2. 內(nèi)嵌函數(shù)必須引用外部函數(shù)中的變量

      3. 外部函數(shù)的返回值必須是內(nèi)嵌函數(shù)

      #閉包函數(shù)的實(shí)例
      def outer( a ):
       b = 10
       def inner():  # 在內(nèi)函數(shù)中 用到了外函數(shù)的臨時(shí)變量
       print(a+b) # 外函數(shù)的返回值是內(nèi)函數(shù)的引用
       return inner
      
      if __name__ == '__main__':
       demo = outer(5)
       demo() # 15
      
      # 在這里我們調(diào)用外函數(shù)傳入?yún)?shù)5
      # 此時(shí)外函數(shù)兩個(gè)臨時(shí)變量 a是5 b是10 ,并創(chuàng)建了內(nèi)函數(shù),然后把內(nèi)函數(shù)的引用返回存給了demo
      # 外函數(shù)結(jié)束的時(shí)候發(fā)現(xiàn)內(nèi)部函數(shù)將會(huì)用到自己的臨時(shí)變量,這兩個(gè)臨時(shí)變量就不會(huì)釋放,會(huì)綁定給這個(gè)內(nèi)部函數(shù)
      # 我們調(diào)用內(nèi)部函數(shù),看一看內(nèi)部函數(shù)是不是能使用外部函數(shù)的臨時(shí)變量
      # demo存了外函數(shù)的返回值,也就是inner函數(shù)的引用,這里相當(dāng)于執(zhí)行inner函數(shù)
      
      閉包實(shí)例

      3、閉包中內(nèi)函數(shù)修改外函數(shù)局部變量

      1、在基本的python語(yǔ)法當(dāng)中,一個(gè)函數(shù)可以隨意讀取全局?jǐn)?shù)據(jù),但是要修改全局?jǐn)?shù)據(jù)的時(shí)候有兩種方法:

      1) global 聲明全局變量

      2) 全局變量是可變類型數(shù)據(jù)的時(shí)候可以修改

      2、在閉包情況下使用下面兩種方法修改

      1)在python3中,可以用nonlocal 關(guān)鍵字聲明 一個(gè)變量, 表示這個(gè)變量不是局部變量空間的變量,需要向上一層變量空間找這個(gè)變量。

      2)在python2中,沒(méi)有nonlocal這個(gè)關(guān)鍵字,我們可以把閉包變量改成可變類型數(shù)據(jù)進(jìn)行修改,比如列表。

      #修改閉包變量的實(shí)例
      def outer( a ):
       b = 10  # a和b都是閉包變量
       c = [a]  # 這里對(duì)應(yīng)修改閉包變量的方法2
       def inner():
       # 方法一: nonlocal關(guān)鍵字聲明(python3)
       nonlocal b
       b+=1
      
       # 方法二: 把閉包變量修改成可變數(shù)據(jù)類型 比如列表(python2)
       c[0] += 1
       print(c[0])
       print(b)
       return inner  # 外函數(shù)的返回值是內(nèi)函數(shù)的引用
      
      if __name__ == '__main__':
       demo = outer(5)
       demo()  # 6 11
      
      閉包中內(nèi)函數(shù)修改外函數(shù)局部變量

      1.2 Python里的拷貝

      1、預(yù)備知識(shí)一——python的變量及其存儲(chǔ)

      1. python的一切變量都是對(duì)象,變量的存儲(chǔ),采用了引用語(yǔ)義的方式,存儲(chǔ)的只是一個(gè)變量的值所在的內(nèi)存地址,而不是這個(gè)變量的只本身

      2. 不管多么復(fù)雜的數(shù)據(jù)結(jié)構(gòu),淺拷貝都只會(huì)copy一層。

      理解:兩個(gè)人公用一張桌子,只要桌子不變,桌子上的菜發(fā)生了變化兩個(gè)人是共同感受的。

      >>> str1 = 'hello'
      >>> str2 = str1
      
      #1、讓str1和str2變量都存儲(chǔ)了‘hello'所在的內(nèi)存地址
      >>> id(str1)
      >>> id(str1)
      >>>
      
      #2、當(dāng)str1的值變成‘new hello'后str1的值被重新賦值成'new hello'的內(nèi)存地址,而str2的值依舊是‘hello'的內(nèi)存地址
      >>> str1 = 'new hello'
      >>> id(str1)
      >>> id(str2)
      
      #3、不管多么復(fù)雜的數(shù)據(jù)結(jié)構(gòu),淺拷貝都只會(huì)copy一層。
      >>> sourceList = [1,2,[3,4]]
      >>> newList = sourceList
      
      >>> l[2][0]=100
      
      >>> sourceList
      [1, 2, [100, 4]]
      >>> newList
      [1, 2, [100, 4]]
      
      不管多么復(fù)雜的數(shù)據(jù)結(jié)構(gòu),淺拷貝都只會(huì)copy一層

      2、淺copy與deepcopy

      1、淺copy: 不管多么復(fù)雜的數(shù)據(jù)結(jié)構(gòu),淺拷貝都只會(huì)copy一層

      2、deepcopy : 深拷貝會(huì)完全復(fù)制原變量相關(guān)的所有數(shù)據(jù),在內(nèi)存中生成一套完全一樣的內(nèi)容,我們對(duì)這兩個(gè)變量中任意一個(gè)修改都不會(huì)影響其他變量

      import copy
      sourceList = [1,2,3,[4,5,6]]
      copyList = copy.copy(sourceList)
      deepcopyList = copy.deepcopy(sourceList)
      
      sourceList[3][0]=100
      
      print(sourceList)  # [1, 2, 3, [100, 5, 6]]
      print(copyList)  # [1, 2, 3, [100, 5, 6]]
      print(deepcopyList)  # [1, 2, 3, [4, 5, 6]]
      
      淺copy與deepcopy

      1.3 Python垃圾回收機(jī)制

      垃圾回收機(jī)制:https://www.jb51.net/article/168707.htm

      1、引用計(jì)數(shù)

      1. 原理

      1)當(dāng)一個(gè)對(duì)象的引用被創(chuàng)建或者復(fù)制時(shí),對(duì)象的引用計(jì)數(shù)加1;當(dāng)一個(gè)對(duì)象的引用被銷毀時(shí),對(duì)象的引用計(jì)數(shù)減1.

      2)當(dāng)對(duì)象的引用計(jì)數(shù)減少為0時(shí),就意味著對(duì)象已經(jīng)再?zèng)]有被使用了,可以將其內(nèi)存釋放掉。

      2. 優(yōu)點(diǎn)

      引用計(jì)數(shù)有一個(gè)很大的優(yōu)點(diǎn),即實(shí)時(shí)性,任何內(nèi)存,一旦沒(méi)有指向它的引用,就會(huì)被立即回收,而其他的垃圾收集技術(shù)必須在某種特殊條件下才能進(jìn)行無(wú)效內(nèi)存的回收。

      3. 缺點(diǎn)

      1)引用計(jì)數(shù)機(jī)制所帶來(lái)的維護(hù)引用計(jì)數(shù)的額外操作與Python運(yùn)行中所進(jìn)行的內(nèi)存分配和釋放,引用賦值的次數(shù)是成正比的,

      2)這顯然比其它那些垃圾收集技術(shù)所帶來(lái)的額外操作只是與待回收的內(nèi)存數(shù)量有關(guān)的效率要低。

      3)同時(shí),因?yàn)閷?duì)象之間相互引用,每個(gè)對(duì)象的引用都不會(huì)為0,所以這些對(duì)象所占用的內(nèi)存始終都不會(huì)被釋放掉。

      2、標(biāo)記-清除

      1. 說(shuō)明  

      1)它分為兩個(gè)階段:第一階段是標(biāo)記階段,GC會(huì)把所有的活動(dòng)對(duì)象打上標(biāo)記,第二階段是把那些沒(méi)有標(biāo)記的對(duì)象非活動(dòng)對(duì)象進(jìn)行回收。

      2)對(duì)象之間通過(guò)引用(指針)連在一起,構(gòu)成一個(gè)有向圖

      3)從根對(duì)象(root object)出發(fā),沿著有向邊遍歷對(duì)象,可達(dá)的(reachable)對(duì)象標(biāo)記為活動(dòng)對(duì)象,不可達(dá)的對(duì)象就是要被清除的非活動(dòng)對(duì)象。

      根對(duì)象就是全局變量、調(diào)用棧、寄存器。

      注:像是PyIntObject、PyStringObject這些不可變對(duì)象是不可能產(chǎn)生循環(huán)引用的,因?yàn)樗鼈儍?nèi)部不可能持有其它對(duì)象的引用。

      python中閉包、深淺拷貝、垃圾回收、with語(yǔ)句的示例分析

      1. 在上圖中,可以從程序變量直接訪問(wèn)塊1,并且可以間接訪問(wèn)塊2和3,程序無(wú)法訪問(wèn)塊4和5

      2. 第一步將標(biāo)記塊1,并記住塊2和3以供稍后處理。

      3. 第二步將標(biāo)記塊2,第三步將標(biāo)記塊3,但不記得塊2,因?yàn)樗驯粯?biāo)記。

      4. 掃描階段將忽略塊1,2和3,因?yàn)樗鼈円驯粯?biāo)記,但會(huì)回收塊4和5。

      2、缺點(diǎn)

      1)標(biāo)記清除算法作為Python的輔助垃圾收集技術(shù),主要處理的是一些容器對(duì)象,比如list、dict、tuple等

      因?yàn)閷?duì)于字符串、數(shù)值對(duì)象是不可能造成循環(huán)引用問(wèn)題。

      2)清除非活動(dòng)的對(duì)象前它必須順序掃描整個(gè)堆內(nèi)存,哪怕只剩下小部分活動(dòng)對(duì)象也要掃描所有對(duì)象。

      3、分代回收

      1. 分代回收是建立在標(biāo)記清除技術(shù)基礎(chǔ)之上的,是一種以空間換時(shí)間的操作方式。

      2. Python將內(nèi)存分為了3“代”,分別為年輕代(第0代)、中年代(第1代)、老年代(第2代)

      3. 他們對(duì)應(yīng)的是3個(gè)鏈表,它們的垃圾收集頻率與對(duì)象的存活時(shí)間的增大而減小。

      4. 新創(chuàng)建的對(duì)象都會(huì)分配在年輕代,年輕代鏈表的總數(shù)達(dá)到上限時(shí),Python垃圾收集機(jī)制就會(huì)被觸發(fā)

      5. 把那些可以被回收的對(duì)象回收掉,而那些不會(huì)回收的對(duì)象就會(huì)被移到中年代去,依此類推

      6. 老年代中的對(duì)象是存活時(shí)間最久的對(duì)象,甚至是存活于整個(gè)系統(tǒng)的生命周期內(nèi)。

      1.4 上下文管理(with)

      1、什么是with語(yǔ)句

      1. with是一種上下文管理協(xié)議,目的在于從流程圖中把 try,except 和finally 關(guān)鍵字和資源分配釋放相關(guān)代碼統(tǒng)統(tǒng)去掉,簡(jiǎn)化try….except….finlally的處理流程。

      2. 所以使用with處理的對(duì)象必須有enter()和exit()這兩個(gè)方法

      1)with通過(guò)enter方法初始化(enter方法在語(yǔ)句體執(zhí)行之前進(jìn)入運(yùn)行)

      2)然后在exit中做善后以及處理異常(exit()方法在語(yǔ)句體執(zhí)行完畢退出后運(yùn)行)

      2、with語(yǔ)句使用場(chǎng)景

      1. with 語(yǔ)句適用于對(duì)資源進(jìn)行訪問(wèn)的場(chǎng)合,確保不管使用過(guò)程中是否發(fā)生異常都會(huì)執(zhí)行必要的“清理”操作,釋放資源

      2. 比如文件使用后自動(dòng)關(guān)閉、線程中鎖的自動(dòng)獲取和釋放等。

      3、with處理文件操作的實(shí)例

      with open('/etc/passwd') as f:
       for line in f:
       print(line)
       # 這段代碼的作用:打開(kāi)一個(gè)文件,如果一切正常,把文件對(duì)象賦值給f,然后用迭代器遍歷文件中每一行,當(dāng)完成時(shí),關(guān)閉文件;
      
       # 而無(wú)論在這段代碼的任何地方,如果發(fā)生異常,此時(shí)文件仍會(huì)被關(guān)閉。

      看完了這篇文章,相信你對(duì)“python中閉包、深淺拷貝、垃圾回收、with語(yǔ)句的示例分析”有了一定的了解,如果想了解更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊頻道,感謝各位的閱讀!

      另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。


      分享名稱:python中閉包、深淺拷貝、垃圾回收、with語(yǔ)句的示例分析-創(chuàng)新互聯(lián)
      文章位置:http://www.ef60e0e.cn/article/diejgd.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        南皮县| 顺平县| 固始县| 德州市| 于都县| 鹤庆县| 府谷县| 宜丰县| 淳化县| 新和县| 积石山| 临泽县| 和平县| 永新县| 准格尔旗| 武功县| 马关县| 孟津县| 黄大仙区| 铜陵市| 乐亭县| 虎林市| 莎车县| 镇康县| 体育| 浠水县| 龙海市| 永州市| 新泰市| 开阳县| 临颍县| 东安县| 博乐市| 大冶市| 七台河市| 浏阳市| 浮山县| 吴桥县| 铜山县| 南安市| 涟水县|