2014-04-24 13 views
7

Vì vậy, danh sách là unhashable:Điều gì làm cho danh sách không thể sửa được?

>>> { [1,2]:3 } 
TypeError: unhashable type: 'list' 

Sau đây page đưa ra một lời giải thích:

Một danh sách là một loại có thể thay đổi, và không thể được sử dụng như một chìa khóa trong một cuốn từ điển (nó có thể thay đổi trong - nơi làm cho khóa không còn có thể định vị được trong bảng băm nội bộ của từ điển ).

Tôi hiểu tại sao không nên sử dụng các đối tượng có thể thay đổi được làm khóa từ điển. Tuy nhiên, Python tăng cùng một ngoại lệ ngay cả khi tôi đang đơn giản là cố gắng để băm một danh sách (không phụ thuộc vào sự sáng tạo từ điển)

>>> hash([1,2]) 
TypeError: unhashable type: 'list' 

Liệu Python làm điều này như một sự đảm bảo rằng các loại có thể thay đổi sẽ không bao giờ được sử dụng như phím từ điển? Hoặc là có một lý do khác làm cho các đối tượng có thể thay đổi không thể băm, bất kể tôi định sử dụng chúng như thế nào?

+2

'băm()' chỉ đơn giản gọi phương thức '__hash__' của đối tượng và đó chính xác là những gì dicts làm. –

+1

Điều gì làm * bạn định làm gì với băm? Động lực là băm của một đối tượng không nên thay đổi, và các đối tượng bằng nhau thường phải băm giống nhau. – geoffspear

Trả lời

17

Từ điển và bộ sử dụng thuật toán băm để xác định duy nhất một mục. Và những thuật toán này sử dụng các mục được sử dụng làm khóa để đưa ra giá trị băm duy nhất. Vì danh sách có thể thay đổi nên nội dung của danh sách có thể thay đổi. Sau khi cho phép danh sách nằm trong từ điển dưới dạng khóa, nếu nội dung của danh sách thay đổi, giá trị băm cũng sẽ thay đổi. Nếu giá trị băm thay đổi sau khi nó được lưu trữ tại một vị trí cụ thể trong từ điển, nó sẽ dẫn đến một từ điển không phù hợp. Ví dụ, ban đầu danh sách sẽ được lưu trữ tại vị trí A, được xác định dựa trên giá trị băm. Nếu giá trị băm thay đổi và nếu chúng ta tìm kiếm danh sách, chúng tôi có thể không tìm thấy nó ở vị trí A hoặc theo giá trị băm mới, chúng tôi có thể tìm thấy một số đối tượng khác.

Vì không thể đưa ra giá trị băm, nội bộ có no hashing function defined for lists.

PyObject_HashNotImplemented,    /* tp_hash */ 

Khi hàm băm không được thực hiện, khi bạn sử dụng nó như là một chìa khóa trong từ điển, hoặc mạnh mẽ cố gắng để có được giá trị băm với hash chức năng, nó không băm nó và vì vậy nó không thành công với loại unhashable

TypeError: unhashable type: 'list' 
Các vấn đề liên quan