小和大整數對象池以及is與==的區別

小整數對象池

在實際的編程中,數值比較小的整數,比如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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章