對象和引用

對象:

內(nèi)存中存放的一塊邏輯的整體數(shù)據(jù)對象具有唯一的標(biāo)識符,對象包括屬性(Properties)和方法(Methods),屬性就是需要記憶的信息,方法就是對象
能夠提供的服務(wù)。在面向?qū)ο?Object Oriented) 的軟件中,對象(Object)是某一個類(Class)的實例(Instance)。在python中輸入dir(2)
可以知道,在python中2并不是簡單的一個整數(shù),而且包含了很多內(nèi)置的方法。

引用:

引用像指針一樣指向一塊內(nèi)存空間,跟c語言中的指針相似。

舉例:

整數(shù)對象

簡單的賦值語句 a = 10000, a 指向了 10000 所在的那塊內(nèi)存。a 引用的對象就是存放 1 的內(nèi)存地址。is 判斷兩個變量是否引用同一個對象,id()取得對象的內(nèi)存地址

a = 10000
b = 10000
print a is b

輸出是 False, 可以知道a,b是兩個不同的對象,每次創(chuàng)建都會申請新的內(nèi)存

a = 1
b = 1
print a is b

輸出是 True,a,b又是相同的對象了。這是因為在python啟動的時候,常用的常數(shù)[-5, 256]就建立好,不銷毀的對象,也就是a,b都引用相同的>一塊內(nèi)存(存放10000的內(nèi)存),每次創(chuàng)建這個范圍內(nèi)的整數(shù)對象不會申請新的內(nèi)存。這是個設(shè)計上的均衡,用一些內(nèi)存的浪費,來提高大部分程序>的運行速度

容器對象

python中容器(可以包含其他對象的對象)中存放的對象實際上都是引用

In [17]: a = [[]] * 5
In [18]: a
Out[18]: [[], [], [], [], []]
In [19]: a[1].append(0)
In [20]: a
Out[20]: [[0], [0], [0], [0], [0]]
In [21]: a[0] is a[1]
Out[21]: True

a 列表有五個相同的元素,這五個元素都是對同一個空列表的引用(21行),所以改變其中任何一個元素(不改變對象引用的情況下),所有的五個元>素都會同時進(jìn)行改變

list 是可變對象,在list擴(kuò)容的時候有幾種方法

In [6]: a = [1]
In [7]: id(a)
Out[7]: 28048488
In [8]: a = a + [2]
In [9]: a
Out[9]: [1, 2]
In [10]: id(a)
Out[10]: 28047696

可以看出使用 + 修改列表,創(chuàng)建了新的列表(對象),a 已經(jīng)不是原先那個對象,不存放在原先那個內(nèi)存地址了,進(jìn)行了大量的內(nèi)存復(fù)制

In [21]: a = [1]
In [22]: id(a)
Out[22]: 20913832
In [23]: a += [2]
In [24]: id(a)
Out[24]: 20913832

使用 += 修改列表,并沒有創(chuàng)建新的列表(對象),還存放在原先那個地址。(extend 與 += 幾乎相同,只是extend多了調(diào)用函數(shù)的時間)。

In [29]: a = [1]
In [30]: id(a)
Out[30]: 28048704
In [31]: a.append(2)
In [32]: id(a)
Out[32]: 28048704

使用 append 修改列表,也沒有創(chuàng)建新的列表,也是存放在原先那個地址。append會進(jìn)行提前的內(nèi)存申請,擴(kuò)容時會更快。但是 append 只能進(jìn)行單個元素的擴(kuò)容,內(nèi)存消耗較大。

所以列表擴(kuò)容的時候盡量使用 extend 或者 append(當(dāng)然 list 如果進(jìn)行頻繁大量空間的擴(kuò)容,肯定會造成效率問題)。

string 和 tuple 都是不可變對象,所以在進(jìn)行改變的時候肯定都會創(chuàng)建新的對象。(根據(jù)這個原理,可以思考下為什么 string 進(jìn)行合并的時候為什么建議用join)

函數(shù)對象

在 python 中函數(shù)也是對象,所以我們可以像整數(shù)賦值一樣,將函數(shù)賦值給一個變量,將函數(shù)作為參數(shù)傳遞給另一個函數(shù),我覺得這也是為什么python中存在 decorator 的一個原因

參考:

http://zh.wikipedia.org/wiki/%E5%AF%B9%E8%B1%A1_(%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6

python群 22507237 的 @冒泡 大神

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容