前言:is,==都是用來比較兩個物件是否相等的運算子,可是它們依據什麼來判斷是true 還是 false呢?
一、==
a =[1
,2,3
]b =[1
,2,3
,4]print(id
(a),
id(b)
)# 5005896 , 5005960
print
(a == b)
# false
c = a.copy(
)# [1, 2, 3] [1, 2, 3]
print
(a, c)
print(id
(a),
id(c)
)# 5005896 , 34872584
print
(a == c)
# true
**分析:a變數和b變數的內容、位址均不一樣,結果返回為false,而a變數和c變數的內容一樣,位址不一樣,結果返回為true。所以,可以初步判斷 ==在python中是用來比較內容是否相同的。
二、is
a =[1
,2,3
]b =[1
,2,3
,4]print(id
(a),
id(b)
)# 5005896 , 5005960
print
(a is b)
# false
c = a.copy(
)# [1, 2, 3] [1, 2, 3]
print
(a, c)
print(id
(a),
id(c)
)# 5005896 , 34872584
print
(a is c)
# false
**分析:當位址、內容均不相同的變數a和變數b 進行 is 比較時,結果是false,而當位址不同、內容相同的變數a和變數c進行 is 比較時,結果也是false,所以可以得出 is 在python中用來比較位址是否相同的。
三、為什麼呢?
classa:
def__init__
(self, name)
: self.name = name
a1 = a(
'aa'
)a2 = a(
'aa'
)print
(a1 == a2)
# false
print
(a1 is a2)
# false
classa:
def__init__
(self, name)
: self.name = name
def__eq__
(self, other)
:if self.name == other.name:
return
true
return
false
a1 = a(
'aa'
)a2 = a(
'aa'
)print
(a1 == a2)
# true
print
(a1 is a2)
# false
為什麼在自定義類的物件中,內容即使一樣,= = 比較返回結果也是false呢?
這是因為魔法方法__eq__ 定義了類的等號= =行為,而__eq__魔法方法是預設比較位址的, 在== 進行比較的時候,會自動去呼叫__eq__這個魔法方法,對於系統內建的資料物件(如:int float str list tuple 等)來說,底層已經自己把__eq__魔法方法重寫好,是進行物件內容的比較,這一點不需要我們操心。而對於我們自定義物件(如自定義類的物件)如果我們想用它來比較物件內容的話,則需要我們自己去重寫__eq__這個魔法方法。
對於is 來說,沒有呼叫的內建函式,所以 is 就是用來比較位址是否一樣的。
mysql易混淆點
1 alter table 表名 change name names char 40 after 欄位名 改變位置放到字段之後 before 放到字段之前 2 查詢要攜帶索引字段,通常放在select之後第乙個 3 檢視檢視命令 show table status where comment vie...
C 易混淆點(二)
二進位制的100 的第0位是 0 1 第二位 0 第一位 0 第0位 所以把乙個數的第三位進行清零 置位 取反的操作如下 include define bit3 0x01 3 對乙個數的第三位進行清零 置位 取反 int main 程式的儲存區域分為 段 唯讀資料段 已初始化的讀寫資料段 未初始化的...
python易混淆點二 函式 引數 屬性
在python中,定義乙個函式要使用def語句,依次寫出函式名 括號 括號中的引數和冒號 然後,在縮排塊中編寫函式體,函式的返回值用return語句返回。1.函式 定義函式時,需要確定函式名和 引數個數 函式體內部可以用return隨時返回函式結果 函式執行完畢也沒有return語句時,自動retu...