Python基礎:is和==的區別


一:變量、內存理解

變量:用來標識(identify)一塊內存區域。為了方便表示內存,我們操作變量實質上是在操作變量指向的那塊內存單元。編譯器負責分配。我們可以使用Python內建函數id()來獲取變量的地址

變量名:是一個標識符(dientify),用來代之一塊內存空間,使用這個變量名,我們可以很方便的操作這塊內存區域。

內存:內存是我們電腦硬件,用來存放數據,形象的理解就是內存有一個一個的小格子組成,每個格子的大小是一個字節,每個格子可以存放一個字節大小的數據。我們如何才能知道,數據存放在哪些格子中,那就得靠地址,地址類似於樓房的門牌號,是內存的標識符。

 

二:id()

id(object)函數是返回對象object在其生命周期內位於內存中的地址,id函數的參數類型是一個對象。

 

三:is 和 ==是什么

在 Python 中一切都是對象,毫無例外整數也是對象,對象之間比較是否相等可以用==,也可以用is。==和is操作的區別是:

Is

比較的是兩個對象的id值是否相等,也就是比較倆對象是否為同一個實例對象,是否指向同一個內存地址。

==

比較的是兩個對象的內容是否相等,默認會調用對象的__eq__()方法。

 

四:數據池

--->is比較id是否是同一個內存

1:int  

----->范圍[-5, 256]

對於257,a is b返回的竟然是False,結果可能在你的意料之中,也有可能出乎你的意料,但不管怎么,我們還是要刨根問底,找出問題的真相。

 

解惑一

 

出於對性能的考慮,Python內部做了很多的優化工作,對於整數對象,Python把一些頻繁使用的整數對象緩存起來,保存到一個叫small_ints的鏈表中,在Python的整個生命周期內,任何需要引用這些整數對象的地方,都不再重新創建新的對象,而是直接引用緩存中的對象。Python把這些可能頻繁使用的整數對象規定在范圍[-5, 256]之間的小對象放在small_ints中,但凡是需要用些小整數時,就從這里面取,不再去臨時創建新的對象。因為257不再小整數范圍內,因此盡管a和b的值是一樣,但是他們在Python內部卻是以兩個獨立的對象存在的,各自為政,互不干涉。

 

弄明白第一個問題后,我們繼續在Python交互式命令行中寫一個函數,再來看下面這段代碼:

 

片段一:

 

>>> c = 257

>>> def foo():

...     a = 257

...     b = 257

...     print a is b

...     print a is c

...

>>> foo()

True

False

 

呃,什么情況,是的,你沒看錯,片段一中的這段代碼 a、b 值都是257的情況下,出現了a is b返回True,而a is c 返回的False,a、b、c的值都為257,為什么會出現不同的結果呢?這對於剛剛好不容易建立起來的認知就被徹底否決了嗎,那這段代碼中究竟發生了什么?難道解惑一中的結論是錯誤的嗎?

 

解惑二

為了弄清楚這個問題,我們有必要先理解程序代碼塊的概念。Python程序由代碼塊構成,代碼塊作為程序的一個最小基本單位來執行。一個模塊文件、一個函數體、一個類、交互式命令中的單行代碼都叫做一個代碼塊。在上面這段代碼中,由兩個代碼塊構成,c = 257作為一個代碼塊,函數foo作為另外一個代碼塊。Python內部為了將性能進一步的提高,凡是在一個代碼塊中創建的整數對象,如果存在一個值與其相同的對象於該代碼塊中了,那么就直接引用,否則創建一個新的對象出來。Python出於對性能的考慮,但凡是不可變對象,在同一個代碼塊中的對象,只有是值相同的對象,就不會重復創建,而是直接引用已經存在的對象因此,不僅是整數對象,還有字符串對象也遵循同樣的原則。所以 a is b就理所當然的返回True了,而c和a不在同一個代碼塊中,因此在Python內部創建了兩個值都是257的對象。

一番長篇大論之后,得出兩點結論:

1、小整數對象[-5,256]是全局解釋器范圍內被重復使用,永遠不會被GC回收。

2、同一個代碼塊中的不可變對象,只要值是相等的就不會重復創建新的對象。

 

2:str:

不能有特殊字符串,全部由字母組成的字符串

字符串中單個*20以內他們的內存地址一樣,單個*21以上,內存地址不一樣

3:py文件

在一個py文件中,只要內容一樣,內存就一樣


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM