在實際的程式設計中,數值比較小的整數,比如1、2、29等,可能在程式中會非常頻繁地使用。在python中,所有的物件都是存活在系統堆上。這就是說,如果沒有特殊的機制,對於這些頻繁使用的小整數物件,python將一次又一次地使用malloc在對上申請空間,並且不厭其煩地一次次free。這樣的操作不僅大大降低了執行效率,而且會在系統對造成大量的記憶體碎片,嚴重影響python的整體效能。因此對於小整數物件使用了物件池技術。設定小整數的範圍為[-5,256]。在這個範圍內的小整數,任意相同的整數都是同乙個物件。 例:
# 測試左邊界:-5
>>
> a =-5
>>
> b =-5
>>
>
id(a)
1449290592
>>
>
id(b)
1449290592
>>
> a is b
true
# 說明在小整數範圍內,數值相同的物件是同乙個物件
>>
>
# 測試超出左邊界的值
>>
> a =-6
>>
> b =-6
>>
>
id(a)
2524207766064
>>
>
id(b)
2524207765904
>>
> a is b
false
# 說明不在小整數範圍內,數值相同的物件是不同的物件
>>
>
# 測試右邊界
>>
> a =
256>>
> b =
256>>
>
id(a)
1449298944
>>
>
id(b)
1449298944
>>
> a is b
true
>>
>
# 測試超出右邊界的值
>>
> a =
257>>
> b =
257>>
>
id(a)
2524207766000
>>
>
id(b)
2524207765904
>>
> a is b
false
>>
>
>>
>
classa(
object):
# 建立類a,在a裡面定義4個整數物件..
. a =
100.
.. b =
100.
.. c =
1000..
. d =
1000..
.>>
>
classb(
object):
# 建立類b,在b裡面定義2個整數物件..
. a =
100.
.. b =
1000..
.>>
> a.a is a.b # 同一**塊裡面的同值的小整數是同乙個物件
true
>>
> a.a is b.a # 不同塊中的同值的小整數物件是同乙個物件。
true
>>
> a.c is a.d # 同**塊中同值的大整數物件是同乙個物件
true
>>
> a.d is b.b # 不同**塊中的同值的大整數物件不是同乙個物件
false
>>
>
前提知識:python中物件包含的三個基本要素,分別是:id(身份標識)、type(資料型別)和value(值)。
注釋:id()是物件的身份,相當於我們每個人的身份證號碼一樣,唯一值。
"=="是用來比較物件的數值(內容)的,它是以value來判段的。
"is"是用來比較物件的身份的,它是以id來判斷的。
>>
> a =
100000
>>
> b =
100000
>>
> a == b
true
# 數值相等
>>
> a is b
false
# 不同物件
>>
>
# 可以從id值看出這兩個不是同乙個物件。
>>
>
id(a)
2524207766000
>>
>
id(b)
2524207765904
————————————————
88054544
Python中小整數物件池和大整數物件池
1.小整數物件池 整數在程式中的使用非常廣泛,python為了優化速度,使用了小整數物件池,避免為整數頻繁申請和銷毀記憶體空間。python 對小整數的定義是 5,256 這些整數物件是提前建立好的,不會被垃圾 在乙個 python 的程式中,無論這個整數處於legb中的哪個位置,所有位於這個範圍內...
python 變數之小整數池跟大整數池
在python中定義變數會有 id,type,value。對於 比較的是value,對於is比較的是id。因此,對於相同value的變數,它的type相同,但是它的id值可能不一樣。對於相同id的變數,它的type和value值肯定是一樣。例如 但是,有的時候對於相同的值,如果建立兩次,會發現它的i...
小整數池以及字串駐留機制
在 5,256 這個區間的整數,在記憶體中僅僅會存放乙份。舉例說明 在python中,兩次重複宣告乙個內容一樣的變數的時候,其id 是不一樣的 但是如果在宣告整數的時候,數字是在 5,256 這個區間的整數,其在記憶體中就僅僅存放了乙份,所以id 是一樣的 但是僅僅限於整數,如果是小數則不會觸發 前...