小和大整數物件池以及is與 的區別

2021-10-07 03:45:28 字數 2490 閱讀 9898

在實際的程式設計中,數值比較小的整數,比如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 是一樣的 但是僅僅限於整數,如果是小數則不會觸發 前...