一文搞懂python中的is和 (深度解析)

2022-07-02 16:42:12 字數 2237 閱讀 2374

python中的is用於比較物件的識別符號是否相等。==是比較值是否相等。

物件的識別符號可以簡單地理解成物件的記憶體位址,在生命週期中是固定不變的。id()可以得到物件識別符號的整數表示。示例如下

person1 = 

person2 =

person3 = person1

# 輸出各個字典物件的識別符號,系統不同,得到的值可能不同

print(id(person1))

# 輸出 52230888

print(id(person2))

# 輸出 52231160

print(id(person3))

# 輸出 52165352

# 可以看到,person1和person3的識別符號是相同的,也就是說,它們是同乙個物件

由上方示例可以看到,簡單的=賦值,是將=兩邊的變數同時指向了乙個記憶體位址,即指向同乙個物件(person1和person3)。新建乙個一模一樣的物件,實際上是不同的物件(person1和person2),它們在記憶體中的位址是不同的。

下面我們分別用is和==比較它們

print(person1 == person2)

# 輸出 true

print(person1 == person3)

# 輸出 true

print(person1 is person2)

# 輸出 false

print(person1 is person3)

# 輸出 true

可以看到,用==判斷時,person1、person2、person3比較的結果都是true,用is比較時,person1和person2比較的結果是false。

原因就是,is比較的是兩個物件的記憶體位址,==比較的是兩個物件的值。這一點可以在大多數情況下使用

對於繼承自object的類產生的物件,==也是比較的記憶體位址。

class t1(object):

def __init__(self, name):

self.name = name

t1 = t1("zhangsan")

t2 = t1("zhangsan")

t3 = t1

print(t1 == t2)

# 輸出 false

print(t1 is t2)

# 輸出 false

print(t1 is t3)

# 輸出 true

print(t1 == t3)

# 輸出 true

#看上面的**,截止到現在,除了t1和t2不相等之外,其他結果都和之前是一樣的,我們再往下看

import copy

# 這裡將t1深拷貝乙份給t4,t1和t4的值是相同的,不過記憶體位址不同

t4 = copy.deepcopy(t1)

print(id(t1))

# 輸出 51745848

print(id(t4))

# 輸出 51746072

print(t1 == t4)

# 輸出 false

print(t1 is t4)

# 輸出false

上方可以驗證,繼承object的類 ,生成的例項,==判斷的也是記憶體位址。

分析:

# ==其實是語法糖,t1 == t4 等同於 t1.__eq__(t4),

# 不同的物件內部實現了不同的 __eq__,那麼我們同樣適用==去比較時,實際上的邏輯判斷是不同的。

# 正如 繼承了object的類,實現的__eq__方法是判斷記憶體位址是否相同。也有很多的物件是判斷值是否相同

# 改寫上方的t1類**如下,再次執行上方**,t1 == t4的結果就是true

class t1(object):

def __init__(self, name):

self.name = name

def __eq__(self, val):

return self.name == val.name

一些注意點:

日常寫**時,在變數和單例值之間比較時,應該使用is,因為is無法過載,python不需要尋找和呼叫特殊方法,而是直接比較記憶體位址。速度更快。常見使用場景如

# 判斷a值為none

a is none

# 判斷a值不為none

a is not none

一文帶你搞懂python中的property

通常我們在獲得變數的一些私有屬性時,必須通過方法來獲取私有屬性,並不能直接訪問 修改其數值的時候也是要通過方法去修改,這樣非常的不方便 所以python提供了一種方式,將呼叫方法的的形式轉變為訪問屬性,這樣使用非常方便 class student def init self 這是乙個私有屬性 sel...

一文搞懂transform skew

目錄 如何理解斜切 skew,先看乙個 demo。在下面的 demo 中,有 4 個正方形,分別是 紅色 不做 skew 變換,綠色 x 方向變換,藍色 y 方向變換,黑色 兩個方向都變換,拖動下面的滑塊可以檢視改變 skew 角度後的效果。切換 selector 可以設定 transform or...

一文搞懂併發和並行

併發和並行是兩個非常容易混淆的概念。它們都可以表示兩個或多個任務一起執行,但是偏重點有點不同。併發偏重於多個任務交替執行,而多個任務之間有可能還是序列的。併發是邏輯上的同時發生 simultaneous 而並行是物理上的同時發生。然而並行的偏重點在於 同時執行 並行 parallel 指在同一時刻,...