Python3中is和 的區別?

2021-10-02 06:01:22 字數 2734 閱讀 6058

1. 背景:

(1)變數、記憶體理解

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

變數名:是乙個識別符號(dientify),用來代之一塊記憶體空間,使用這個變數名,我們可以很方便的操作這塊記憶體區域。

記憶體:記憶體是我們電腦硬體,用來存放資料,形象的理解就是記憶體有乙個乙個的小格仔組成,每個格仔的大小是乙個位元組,每個格仔可以存放乙個位元組大小的資料。我們如何才能知道,資料存放在哪些格仔中,那就得靠位址,位址類似於樓房的門牌號,是記憶體的識別符號。

(2)id(object)函式是返回物件object在其生命週期內位於記憶體中的位址,id函式的引數型別是乙個物件。

(3)物件包含的三個基本要素:id(身份標識)、type(資料型別)和value(值)

2. 比較判斷

is比較的是物件id,也就是比較倆物件是否為同乙個例項物件,是否指向同乙個記憶體位址;

==比較的是物件的value,也就是比較兩個物件的內容是否相等,缺省會呼叫物件的__eq__()方法。

3. 結論

(1)物件是數值型和字串型時,新賦值乙個物件賦值不會新建乙個id,相當於值傳遞。所以在原物件上操作,改變值會改變id(值相同,id相同)

(2)物件是tuple,list,dict或set型時,新賦值乙個物件會新建乙個id,相當於新建物件。所以在原物件上操作,id不變,因為此時沒有新建物件

(3)當變數賦值給物件時,相當於賦值,id不變。

4. 舉例

(1)舉例簡單版

e=f=1g=

1k=e

print

(e is f)

# true,上述(3)

print

(e is g)

# true,上述(1)

print

(e is g)

# true,上述(3)

a=b=[1

,2,3

]c=[1

,2,3

]d=a

print

(a is b)

# true,上述(3)

print

(a == b)

# true

print

(a is c)

# false,上述(2)

print

(a == c)

# true

print

(a == d)

# true,上述(3)

(2)舉例複雜版

def

be_careful

(a, b)

:print

("----a-----"

) a =

1print(id

(a))

# 140707126472960,新物件d「1」賦值給a的id位址

a =2print(id

(a))

# 140707126472992,新物件e「2」賦值給a的id位址

print(id

(2))

# 140707126472992,新物件e「2」賦值給a的id位址

print

("----b-----"

)print(id

(b))

# 2087678202440,物件c「[1, 2, 3]」賦值給b的id位址

b[0]

='what?!'

print(id

(b))

# 2087678202440,物件c「[1, 2, 3]」賦值給b的id位址

print(id

(1))

# 140707124244736,物件a「1」的id位址

a =1

print(id

(a))

# 140707124244736,物件a「1」賦值給a的id位址

print(id

([1,

2,3]

))# 1753786176072,物件b「[1, 2, 3]」的id位址

b =[1,

2,3]

print(id

(b))

# 1753786176072,物件b「[1, 2, 3]」賦值給b的id位址

b =[1,

2,3]

print(id

(b))

# 1753786176072,新建乙個物件c「[1, 2, 3]」賦值給b的id位址

be_careful(a, b)

# 見函式

print

(a, b)

# 1 ['what?!', 2, 3]

print(id

(2))

# 140707126472992,物件e「2」賦值給a的id位址

print(id

(b))

# 1753786176072,物件c「[1, 2, 3]」賦值給b的id位址

附圖:

Python3 和 is 的區別

本文由 luzhuo 編寫,請保留該資訊.原文 以下 以python3.6.1為例 less is more is 判斷兩個物件是否為同一物件,是通過id來判斷的 當兩個基本型別資料 或元組 內容相同時,id會相同,但並不代表a會隨b的改變而改變 判斷兩個物件的內容是否相同,是通過呼叫eq 來判斷的...

Python2和Python3中 的區別

首先區別於 表示整除,被除數和除數均為整型時 得到的結果為整型,被除數和除數至少有乙個是浮點型時,得到的結果是浮點型。也就是說 操作python2和python3沒有區別 表示除法,在python3中,無論被除數和除數是哪種型別,得到的都是浮點型。在python2中,被除數和除數至少有乙個浮點型時,...

Python3中 bytes str的區別

python3中最大的新特性就是對文字和二進位制資料做了更清晰的區分。文字通常是unicode字符集,並且用str字串型別表示,而二進位制資料用bytes位元組型別表示。在python3中,字串str和位元組bytes是不可以混合使用的,這也使得二者之間更以區分。你不能將字串和位元組連線起來,不能在...