3
我注意到list.remove
奇怪的行爲,至少不能通過C源代碼解釋(至少我)。奇怪的行爲list.remove與任意類 - 比較對象
考慮這個類:
class A:
def __init__(self, n1, n2):
self.n1 = n1
self.n2 = n2
def __eq__(self, other):
print('in eq')
return vars(self) == vars(other)
以下代碼:
a1 = A(1, 2)
a2 = A(1, 2)
li = [a1, a2]
li.remove(a1)
我會期待它輸出in eq
但它什麼也不輸出,這意味着A.__eq__
不會被調用。
無論這個
a1 = A(1, 2)
a2 = A(2, 3)
li = [a1, a2]
li.remove(a1)
li.remove(a2)
觸發器A.__eq__
通話。
與同一個對象並最終調用A.__eq__
調用remove
兩次,但(奇怪的是)只有一次:
a1 = A(1, 2)
a2 = A(1, 2)
li = [a1, a2]
li.remove(a1)
li.remove(a1)
# 'in eq'
爲什麼叫
remove
一次不叫A.__eq__
?remove
如何知道它發現要刪除的對象? Python實現使用內存地址進行比較似乎很奇怪,即使我們覆蓋__eq__
。爲什麼與同一個對象是調用
A.__eq__
調用remove
兩次,爲什麼只有一次?
正如我懷疑。我懷疑是否有一個很好的歷史原因,即使我們重寫'__eq__','remove'也會首先使用'is'。我相信獲得的表現是可以忽略的。 – DeepSpace
如果您有比較大的列表來比較'is'可以比單獨比較每個列表元素快得多。 –