Nếu chúng ta thực hiện một củ khoai tây bệnh lý như thế này:Làm một đối tượng x sao cho "x trong [x]" trả về False
>>> class Potato:
... def __eq__(self, other):
... return False
... def __hash__(self):
... return random.randint(1, 10000)
...
>>> p = Potato()
>>> p == p
False
Chúng tôi có thể phá vỡ bộ và dicts theo cách này (lưu ý: nó giống thậm chí nếu __eq__
lợi nhuận True
, nó mucking với băm mà bẻ ra):
>>> p in {p}
False
>>> p in {p: 0}
False
Cũng len({p: 0, p: 0}) == 2
và {p: 0}[p]
tăng KeyError, về cơ bản tất cả những thứ liên quan lập bản đồ đi ra ngoài cửa sổ, như mong đợi ed.
Nhưng những gì tôi không mong đợi là chúng ta không thể danh sách nghỉ
>>> p in [p]
True
Tại sao vậy? Có vẻ như list.__contains__
lặp lại, nhưng trước tiên là checking identity trước khi kiểm tra sự bình đẳng. Vì nó không phải là trường hợp mà danh tính ngụ ý bình đẳng (xem ví dụ đối tượng NaN), lý do cho danh sách ngắn mạch trên so sánh nhận dạng là gì?
Có lẽ 'danh sách .__ contains__' so sánh các đối tượng bằng' id() 'thay vì' eq() '? '(id (p) == id (p)) là True' –
@jonrsharpe OP đã biết về nó. Tôi nghĩ anh ấy muốn hiểu tại sao Danh sách kiểm tra danh tính đối tượng đầu tiên thay vì bình đẳng, tôi đoán vậy. – thefourtheye
@ HåkenLid vâng, đó là những gì nó làm, tôi nghĩ rằng OP đang hỏi * tại sao *. – jonrsharpe