JavaScript の == と === と書いてるのを見かけるけど違う
== は値を比較するので [1, 2] のリストを 2 回作って == で比較すると True
is は参照を比較するので False
値の比較は言語のビルトインだけ特別なものがあるわけじゃなくて 単純に比較用のメソッドを実行した結果を返してるだけ
__eq__ メソッドを実装すれば自分でも扱える
list などはデフォルトで中身が一緒なら同じなるように __eq__ が定義されてる
一部の値は違っても xxx プロパティが一緒なら同じ扱いにするとかもできる
is はオブジェクトの参照を比較するので __eq__ 関係なく別オブジェクトなら False
メソッド実行せず参照比較だけなので速度的には速いはず
◯ 全部 True にする
class A:
def __init__(self, val):
self.value = val
def __eq__(self, target):
return True
a1 = A(100)
a2 = A(200)
print(a1.value) # 100
print(a2.value) # 200
print(a1 == a2) # True
print(a1 is a2) # False
◯ 中の値で比較する
class B:
def __init__(self, val):
self.value = val
def __eq__(self, target):
return self.value == target.value
b1 = B(100)
b2 = B(200)
print(b1.value) # 100
print(b2.value) # 200
print(b1 == b2) # False
print(b1 is b2) # Falseこっちも参照