Python 及 is 相關原理解析

2022-09-28 03:30:11 字數 1397 閱讀 9799

'==' 比較的是兩個物件的值

'is' 比較的是兩個物件的記憶體位址(id)

下面我們著重理解 'is'。對於這個,我們需要知道:小整數物件池,大整數物件池,以及intern機制

小整數池:python預先建立小整數快取池—— [-5~256],無論建立多少個物件,都是指向同乙個位址,這樣是為了避免小整數頻繁申請和釋放記憶體。

>>> a=3

>>> b=3

>>> a is b

true

>>> 1+2 is 3

true

>>> a=1.0

>>> b=1.0

>>> a is b

false

大整數物件池:python 提供了乙個可擴充套件的記憶體空間,也程式設計客棧叫通dsnoqdyp用整數物件池,誰需要用就給誰用,免去了申請記憶體。這個空間是乙個pyintblock結構,是用乙個單向列表連線一串記憶體(block),這個列表由 block_list 維護,而每個 block 維護乙個 整數物件陣列(objects),用於存放被快取的整數物件,即處於乙個記憶體(block)的大整數是同乙個物件。

>>> def func():

... a=10.1

... b=10.1

... return a is b

...>>> func()

true

a和b的賦值都是由同乙個通用整數池項獲得的。

intern機制:python的字串型別中有乙個 interned,它是乙個記錄字串物件的字典,以此來保證這些字串在記憶體中的唯一,相同值的字串會使用同乙個物件。

但是,只對由字母、數字、下劃線組成的字串做intern處理,而存在其他字元的字串則不會。

>>> a='abc'

>>> b='abc'

>>> a is b

true

>>> a='ab 程式設計客棧c'

>>> b='ab c'

>>> a is b

false

此外,python其他的資料型別如字典(dict)、列表(list)、集合(set)等,都是建立不同的物件

>>> a=[1,2,3]

>>> b=[1,2,3]

>>> a is b

false>>> a=>>> b=>>> a is bfalse>>>

補充乙個,下面這種情況是因為上乙個 [1,2,3]被**了,在新建[4,5,6]時那片快取又被用到了

>>> id([1,2,3]) == id([4,5,6www.cppcns.com])

true

>>> id([1,2,3])

36200264l

>>> id([4,5,6])

36200264l

本文位址: /jiaoben/python/342316.html

Python logging模組原理解析及應用

一 logging日誌模組等級 常見log級別從高到低 critical error warning info debug,預設等級為warning,warning級別的log才輸出。程式設計客棧 日誌等級 level 描述critical 當發生嚴重錯誤,導致應用程式不能繼續執行時記錄的資訊 er...

LVS DR工作原理解析及配置解析

client傳送請求至vip,即訪問服務.請求報文源位址位cip,目標位址位vip.lvs排程器vip接收請求,隨即將報文傳送至input鏈,ipvs核心模組確定請求的服務是配置好 的lvs集群服務,然後根據對應的排程演算法選擇後端的rs,並將目標位址修改為rip的mac位址,而後將請求委派給其處理...

python閉包及裝飾器執行原理解析

一 閉包 閉包從形式上來說是在外部函式中定義內部函式,並且內部函式引用了外部函式的變數,此變數叫做自由變數。或者說是將組成函式的語句和這些語句的執行環境打包在一起。閉包滿足的條件 必須有乙個內嵌函式 內嵌函式必須使用外部函式的變數 外部函式的返回值必須是內嵌函式 def closure value ...