Python之易混淆點一

2021-10-01 23:12:50 字數 2111 閱讀 7528

前言: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...