物件身份比較 is 整型物件和字串物件的快取

2022-05-22 00:54:09 字數 1383 閱讀 4379

最近開始學習python,其實知道python和想學的念頭算算也有兩三年了(好慚愧》<~),但怎麼說也一直沒有乙個「誘因」吧。。然後實驗室最近需要學習swift物件儲存,加之openstack這個開源雲平台的整套東西都是用python寫的,所以go go go開始動手啦。

作為第一篇學習記錄,題目實在是不好起。。進入正題。。

首先,丟擲題目:

定義變數

1 a = 10

2 b = 10

3 c = 100

4 d = 100

5 e = 10.0

6 f = 10.0

請給出以下比較的輸出結果  

1 a isb2

#true

34 c isd5

#true

67 e isf8

#false

首先,我們需要辨別is和==的區別:is用於測試兩個物件是否指向同乙個物件,而==比較的是物件的值。所以

a is b

這個表示式等價於線面這個表示式:

id(a) == id(b)

因此在上述題目中,我們建立的這「6個」數值物件,實際上並不是6個,而是a和b指向同乙個,c和d指向同乙個,e和f分別為乙個值為10.0的物件。為什麼我們本應建立的6個物件變成了4個呢?這是由於整型物件和字串物件是不可變物件,所以python會很高效的快取它們,這會造成我們認為python應該建立新物件時,它卻沒有建立新物件的假象。再來看兩個例子:

x = 9999y = 9999s1 = '

a string

's2 = '

a string'#

輸出結果

x isy#

false

s1 iss2#

true

x和y都建立了9999,為什麼它們又沒有指向同乙個9999物件呢?這是因為python僅快取簡單整型,因為它認為在python應用程式中這些小整型會被經常用到,範圍會根據版本不同有所變動。在python2.3中決定,在預定義快取字串表之外的字串,如果不再有任何引用指向它,那麼這個字串將不會被快取。

此外,針對另一種不可變型別 元組,它的行為與整型物件和字串物件有些不同,例如:

t1 =()

t2 =()

t3 = (1, 2)

t4 = (1, 2) #

輸出結果

t1 ist2#

true

t3 ist4#

false

因此,並不能說明不可變型別中相同的物件值具有相同的引用,要看具體的整型數值範圍、元組是否為空等情況。

python物件身份的比較

物件和類 物件 屬性 方法 python是把所有的都當做乙個物件,屬性就是乙個具體的值,而方法就是對於物件來說,可以通過什麼方法來操作物件。物件身份的比較 foo1 foo2 4.3 可能我們會認為這是乙個多重賦值的過程,將4.3賦值為foo1,foo2這兩個變數,但是實際上是建立了乙個4.3的數字...

物件身份比較操作符

1 python提供了is和is not操作符來測試兩個變數是否指向同乙個物件。a is b 這個表示式等價於下面的表示式。id a id b 2 a 1 id a 1502566672 b 1 id b 1502566672 c 1.0 id c 5448880 d 1.0 id d 329857...

物件的身份和型別

物件的身份和型別 比較兩個物件 def compare a,b if a is b a和b是同乙個物件 statements if a b a和b具有相同的值 statements if type a is type b a和b具有相同的型別 statements if type d is dict...