2016-06-29 14 views
5

Tôi đang cố gắng hiểu những từ điển Python phải thực hiện nội bộ để định vị một khóa. Dường như với tôi rằng hash sẽ được đánh giá trước tiên, và nếu có xung đột, Python sẽ lặp qua các phím cho đến khi nó tìm thấy một khóa mà eq trả về Đúng. Mà làm cho tôi tự hỏi tại sao đoạn mã sau công trình (mã kiểm tra chỉ để tìm hiểu các ruột):Thứ tự __hash__ và __eq__ đánh giá cho một dict Python là gì?

class MyClass(object): 
    def __eq__(self, other): 
     return False 

    def __hash__(self): 
     return 42 

if __name__=='__main__': 

    o1 = MyClass() 
    o2 = MyClass() 
    d = {o1: 'o1', o2: 'o2'} 
    assert(o1 in d)  # 1 
    assert(d[o1]=='o1') # 2 
    assert(o2 in d)  # 3 
    assert(d[o2]=='o2') # 4 

không điển nên không thể tìm chìa khóa đúng (trở về hoặc là 'o1' hoặc 'o2' trong cả hai trường hợp # 2 và # 4 hoặc ném lỗi, tùy thuộc vào việc triển khai nội bộ). Làm thế nào là nó có thể đất trên khóa chính xác trong cả hai trường hợp, khi nó không bao giờ nên có thể một cách chính xác 'equate' các phím (kể từ eq trả về False).

Tất cả các tài liệu tôi đã nhìn thấy trên băm luôn đề cập đến bămeq với nhau, không bao giờ cmp, ne vv, mà làm cho tôi nghĩ rằng những 2 là những người duy nhất mà đóng một vai trò trong việc này kịch bản.

Trả lời

5

Bất cứ điều gì bạn sử dụng làm khóa chính tả đều phải thỏa mãn bất biến mà bool(x == x) is True. (Tôi đã chỉ nói x == x, nhưng có những đối tượng hợp lý mà thậm chí không phải là một boolean.)

Giả định này sẽ giữ, vì vậy thói quen nó sử dụng để kiểm tra bình đẳng chính thực sự kiểm tra nhận dạng đối tượng đầu tiên trước khi sử dụng ==. Kiểm tra sơ bộ này là một chi tiết thực hiện; bạn không nên dựa vào nó xảy ra hoặc không xảy ra.

Đối tượng hợp lý mà (x == x) is not True bao gồm float('nan')numpy.array([1, 2]).

+0

vì vậy trong ví dụ của mình o1 == o1 sẽ trả về False, nhưng id (o1) == id (o1) sẽ trả về True? –

+0

Tôi vừa thử nó và o1 == o1 trả về Sai và id (o1) == id (o1) trả về True –

+0

@TimurRidjanovic: Có. 'is' là một cách an toàn hơn và đôi khi hiệu quả hơn để so sánh bản sắc đối tượng. – user2357112

Các vấn đề liên quan