国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python深入06——python的內(nèi)存管理詳解

2020-02-23 04:08:56
字體:
供稿:網(wǎng)友

語言的內(nèi)存管理是語言設(shè)計的一個重要方面。它是決定語言性能的重要因素。無論是C語言的手工管理,還是Java的垃圾回收,都成為語言最重要的特征。這里以Python語言為例子,說明一門動態(tài)類型的、面向?qū)ο蟮恼Z言的內(nèi)存管理方式。

對象的內(nèi)存使用

賦值語句是語言最常見的功能了。但即使是最簡單的賦值語句,也可以很有內(nèi)涵。Python的賦值語句就很值得研究。

a = 1

整數(shù)1為一個對象。而a是一個引用。利用賦值語句,引用a指向?qū)ο?。Python是動態(tài)類型的語言(參考動態(tài)類型),對象與引用分離。Python像使用“筷子”那樣,通過引用來接觸和翻動真正的食物——對象。

 引用和對象

為了探索對象在內(nèi)存的存儲,我們可以求助于Python的內(nèi)置函數(shù)id()。它用于返回對象的身份(identity)。其實,這里所謂的身份,就是該對象的內(nèi)存地址。

a = 1print(id(a))print(hex(id(a)))

在我的計算機上,它們返回的是:

11246696
'0xab9c68'

分別為內(nèi)存地址的十進(jìn)制和十六進(jìn)制表示。 

在Python中,整數(shù)和短小的字符,Python都會緩存這些對象,以便重復(fù)使用。當(dāng)我們創(chuàng)建多個等于1的引用時,實際上是讓所有這些引用指向同一個對象。

a = 1b = 1print(id(a))print(id(b))

上面程序返回

11246696
11246696

可見a和b實際上是指向同一個對象的兩個引用。

為了檢驗兩個引用指向同一個對象,我們可以用is關(guān)鍵字。is用于判斷兩個引用所指的對象是否相同。

# Truea = 1b = 1print(a is b)# Truea = "good"b = "good"print(a is b)# Falsea = "very good morning"b = "very good morning"print(a is b)# Falsea = []b = []print(a is b)

上面的注釋為相應(yīng)的運行結(jié)果。可以看到,由于Python緩存了整數(shù)和短字符串,因此每個對象只存有一份。比如,所有整數(shù)1的引用都指向同一對象。即使使用賦值語句,也只是創(chuàng)造了新的引用,而不是對象本身。長的字符串和其它對象可以有多個相同的對象,可以使用賦值語句創(chuàng)建出新的對象。

 在Python中,每個對象都有存有指向該對象的引用總數(shù),即引用計數(shù)(reference count)。

我們可以使用sys包中的getrefcount(),來查看某個對象的引用計數(shù)。需要注意的是,當(dāng)使用某個引用作為參數(shù),傳遞給getrefcount()時,參數(shù)實際上創(chuàng)建了一個臨時的引用。因此,getrefcount()所得到的結(jié)果,會比期望的多1。

from sys import getrefcounta = [1, 2, 3]print(getrefcount(a))b = aprint(getrefcount(b))            
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 公主岭市| 铁岭县| 东宁县| 泸水县| 东平县| 高州市| 寿宁县| 故城县| 鹤山市| 额敏县| 屏山县| 靖远县| 永年县| 靖州| 滕州市| 临邑县| 晋中市| 焉耆| 通榆县| 曲周县| 福清市| 卢龙县| 怀集县| 新安县| 兰州市| 视频| 武宁县| 宜州市| 清原| 滦平县| 屏东县| 会昌县| 耒阳市| 平南县| 商城县| 繁昌县| 澄江县| 安新县| 江山市| 县级市| 聊城市|