在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Python/ Python 中有方法可以直接刪除一個(gè)對(duì)象嗎 ?

Python 中有方法可以直接刪除一個(gè)對(duì)象嗎 ?

今天才突然發(fā)現(xiàn) del 刪除的其實(shí)是一個(gè)對(duì)象的 引用, 那么 Python 中是否有方法可以直接刪除一個(gè)對(duì)象呢 ?

回答
編輯回答
陪妳哭

你是對(duì)的,"del 刪除的其實(shí)是一個(gè)對(duì)象的 引用",這正是python作為高級(jí)語言的一個(gè)很好的特性,python本身提供了垃圾回收(GC)機(jī)制,讓用戶從繁瑣的手動(dòng)維護(hù)內(nèi)存的工作中,當(dāng)一個(gè)對(duì)象的引用計(jì)數(shù)為0時(shí),那該對(duì)象將會(huì)被垃圾回收機(jī)制回收。

至于題主說的刪除一個(gè)對(duì)象我理解的刪除 是 C 語言所提供的 free 接口將內(nèi)存釋放并交由操作系統(tǒng)管理這種形式的刪除。但這部分要解釋起來還是比較繁瑣的。

在 Python 中,有自己的內(nèi)存管理機(jī)制,并分了好幾個(gè)層級(jí):

圖片描述

在最底層(第0層), 是 C 語言所提供的 mallocfree 接口, 屬于操作系統(tǒng)提供的內(nèi)存管理接口。在第1層中,就有了內(nèi)存池,這是為了避免大量地執(zhí)行 mallocfree 操作, 不然容易導(dǎo)致操作系統(tǒng)頻繁地在用戶態(tài)和內(nèi)核態(tài)之間進(jìn)行切換。 因此python引入了一個(gè)內(nèi)存池機(jī)制, 用于管理對(duì)小塊內(nèi)存的申請(qǐng)和釋放,垃圾回收對(duì)象之后的內(nèi)存就放在這一層而沒有被真正釋放。

既然對(duì)象回收后都放在第一層而沒有真正釋放,那么當(dāng)讀取較大文件后即使釋放它,python的內(nèi)存占用是不是遲遲居高不下呢?在python2.4版本前(好像是這個(gè)版本,有點(diǎn)記不清了)確實(shí)是這樣的,后來,為了解決這個(gè)問題,于是就當(dāng) arena (可以理解為由內(nèi)存塊組成了一片區(qū)域)中都沒有被使用,那么再調(diào)用 C 語言的 free 。

總結(jié)一下,盡管垃圾回收機(jī)制會(huì)自動(dòng)回收對(duì)象,但它的內(nèi)存一般都不會(huì)被真正的釋放,而是放置于內(nèi)存池中的以便程序創(chuàng)建新的對(duì)象。若想像題主中的直接刪除一個(gè)對(duì)象,目前我似乎沒找到有什么API可以 free 的。

2017年12月15日 04:49
編輯回答
疚幼
  • 刪除了該對(duì)象的引用
  • 該對(duì)象的引用計(jì)數(shù)-1
  • 如果該對(duì)象的引用計(jì)數(shù)=0,則會(huì)被垃圾回收
  • 對(duì)象被銷毀,該對(duì)象的內(nèi)存被釋放

如果顯式直接刪除對(duì)象,應(yīng)該就是直接釋放該對(duì)象的內(nèi)存了??梢钥紤]使用一下Python的垃圾回收模塊。

import gc
gc.collect()

詳見Python文檔Garbage Collector interface.

2017年11月14日 04:17