小整數對象池
在實際的編程中,數值比較小的整數,比如1、2、29等,可能在程序中會非常頻繁地使用。在Python中,所有的對象都是存活在系統堆上。這就是說,如果沒有特殊的機制,對於這些頻繁使用的小整數對象,Python將一次又一次地使用malloc在對上申請空間,並且不厭其煩地一次次free。這樣的操作不僅大大降低了運行效率,而且會在系統對造成大量的內存碎片,嚴重影響Python的整體性能。因此對於小整數對象使用了對象池技術。設置小整數的範圍爲[-5,256]。在這個範圍內的小整數,任意相同的整數都是同一個對象。
- 小整數的緩衝池是在Python初始化的時候被創建的。
例:
# 測試左邊界:-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
>>>
- 大整數對象池
超出小整數的範圍即爲大整數,每次都會創建一個新的對象。但是處於一個代碼塊的大整數是同一個對象。(具體看下面的代碼演示)
>>> class A(object): # 創建類A,在A裏面定義4個整數對象
... a = 100
... b = 100
... c = 1000
... d = 1000
...
>>> class B(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
>>>
is” 和“==”的區別:
前提知識: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
————————————————
版權聲明:本文爲CSDN博主「有夢想的小樹」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/m0_38109046/article/details/88054544
————————————————
版權聲明:本文爲CSDN博主「有夢想的小樹」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/m0_38109046/article/details/88054544