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是不可以混合使用的,這也使得二者之間更以區分。你不能將字串和位元組連線起來,不能在...