'==' 比較的是兩個物件的值
'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 ...