<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python 那些永遠(yuǎn)用不到的對(duì)象,我們稱之為「垃圾」

          共 1585字,需瀏覽 4分鐘

           ·

          2021-06-08 01:20


          我們知道使用 Python 可以創(chuàng)建對(duì)象,當(dāng)我們?nèi)ヒ盟臅r(shí)候,系統(tǒng)會(huì)開辟一個(gè)內(nèi)存空間存放對(duì)象,不過可能有些對(duì)象我們用完之后,永遠(yuǎn)再也不會(huì)去使用了,那這對(duì)象不能一直留在內(nèi)存里邊吧,對(duì)象已經(jīng)廢了,也就成為了「垃圾」,垃圾要清理掉,內(nèi)存才能騰出位置給別的程序使用。

          那么:

          Python是怎么回收垃圾的?

          先來了解一下「引用次數(shù)」,在 Python 的內(nèi)置模塊 sys 有一個(gè) getrefcount 方法,通過它我們可以得到對(duì)象被引用的次數(shù):


          比如我們定義這樣一個(gè)「s」:

          這里得到的結(jié)果為 2 次引用,其中一次是 s,一次是 getrefcount。

          接下來我們看看這樣的代碼:

          當(dāng)我們執(zhí)行完 fxxk 方法之后,在它下面的 print 調(diào)用會(huì)報(bào)錯(cuò),也就是說我們無法再去引用對(duì)象 s 了,因?yàn)樗呀?jīng)被回收。

          當(dāng)執(zhí)行完 fxxk() 之后,對(duì)象 s 的引用數(shù)量為 0,而在 Python 的垃圾回收算法中,一個(gè)主要的點(diǎn)就是,當(dāng)對(duì)象的引用數(shù)量為 0,說明這個(gè)對(duì)象已經(jīng)成為「垃圾」了,Python 會(huì)將這個(gè)對(duì)象回收掉,從而釋放資源。

          通過統(tǒng)計(jì)引用次數(shù)來釋放資源,是相對(duì)高效可行的,不過也有存在這樣的現(xiàn)象:對(duì)象之間相互循環(huán)引用,會(huì)導(dǎo)致引用數(shù)量為一直不為 0,那么這樣的垃圾是回收不了的,這就可能會(huì)造成內(nèi)存泄漏。

          所以在 Python 新版本中,補(bǔ)充了垃圾回收機(jī)制算法——標(biāo)記清除法和分代收集。

          所謂標(biāo)記清除,就是遍歷所有對(duì)象,通過鏈表逐個(gè)對(duì)象追蹤標(biāo)記到的這些對(duì)象是可達(dá)的,那么剩下那些對(duì)象就是不可達(dá)的,說明它們是垃圾,回收掉,這樣就可以避免對(duì)象循環(huán)引用而沒辦法回收的問題了。

          因?yàn)槊看螛?biāo)記清除的時(shí)候,肯定是占用系統(tǒng)資源的,這時(shí)候就有人想到,是不是可以分代收集,也就是說,分成三代,把第一次遍歷的對(duì)象視為第 0 代,那么第一次遍歷完活下來的對(duì)象,就把它們放入第二代,第二代就不會(huì)被那么「嚴(yán)格」的去掃描,如果第二次遍歷,第二代的對(duì)象又存活,那么就放入第三代,在第三代里面的對(duì)象就更「安全」了。

          因?yàn)閷?duì)象活得越久,說明它越不是「垃圾」。

          以上,我們說的 Python 垃圾回收機(jī)制,都是自動(dòng)的,不用我們親自來清理垃圾。

          那如果我們想自己手動(dòng)來回收垃圾,可不可以實(shí)現(xiàn)呢?

          答案是肯定的。

          Python手動(dòng)回收垃圾

          我們可以通過 del 命令來刪除對(duì)象的引用,然后使用 Python 的 gc 模塊,調(diào)用 collect 方法就可以實(shí)現(xiàn)。

          現(xiàn)在來寫個(gè)例子給你參考一下:

          代碼很簡(jiǎn)單,這里我們創(chuàng)建了 handsomeb 對(duì)象,見一個(gè)女生愛一個(gè)。。。

          主要的是最后兩行代碼,當(dāng)我們使用 del handsomeb 的時(shí)候,實(shí)際上就是將 handsomb 這個(gè)對(duì)象給刪除釋放掉,不過這個(gè)時(shí)候還存在那些和 handsomeb 的關(guān)聯(lián)對(duì)象 Girl 們,她們已經(jīng)沒有什么用了,我們可以使用 gc.collect(),將和 handsomeb 關(guān)聯(lián)的對(duì)象們都給釋放掉,這樣就實(shí)現(xiàn)了手動(dòng)回收垃圾。

          你還可以到這里了解更多相關(guān)內(nèi)容:

          https://docs.python.org/zh-cn/3.8/library/gc.html

          ok,以上就是小帥b今天給你帶來的分享,關(guān)于 Python 的垃圾回收問題,面試也常常會(huì)被問到,希望對(duì)你有幫助。

          推薦閱讀


          Pandas處理數(shù)據(jù)太慢,來試試Polars吧!
          懶人必備!只需一行代碼,就能導(dǎo)入所有的Python庫
          絕!關(guān)于pip的15個(gè)使用小技巧
          介紹10個(gè)常用的Python內(nèi)置函數(shù),99.99%的人都在用!
          可能是全網(wǎng)最完整的 Python 操作 Excel庫總結(jié)!

          瀏覽 29
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  91色色图片 | 男人天堂2024手机在线 | 女人一级A片色黄情免费 | 不用播放器在线观看A | 69精品又硬又爽又粗少妇 |