2013-06-20 32 views
15

xem xét:Toán tử == thực sự làm gì với từ điển Python?

>>> a = {'foo': {'bar': 3}} 
>>> b = {'foo': {'bar': 3}} 
>>> a == b 
True 

Theo doc trăn, you can indeed use các == hành vào từ điển.

Điều gì đang thực sự xảy ra ở đây? Python có đệ quy kiểm tra từng phần tử của các từ điển để đảm bảo sự bình đẳng không? Liệu nó có đảm bảo các khóa được so khớp giống hệt nhau không và các giá trị cũng có khớp với nhau không?

Tài liệu có chỉ định chính xác những gì == trên từ điển nghĩa là gì? Hoặc liệu tôi có phải thực hiện phiên bản kiểm tra bình đẳng của riêng mình không?

(Nếu các nhà điều hành == làm việc, tại sao không dicts hashable? Đó là, tại sao tôi không thể tạo ra một set() của dicts, hoặc sử dụng một dict như một chìa khóa từ điển?)

+0

dicts không thể bẻ khóa vì chúng có thể thay đổi và dữ liệu của chúng nhạy cảm với các trạng thái trong quá khứ. Nó sẽ dễ dàng để có hai dicts có trạng thái bình đẳng, nhưng băm không bình đẳng do lịch sử của một dict (có chứa nhiều mục giả) –

+1

@SlaterTyranus: bạn có thể dễ dàng bỏ qua các mục giả; đó không phải là một vấn đề. Sự biến đổi là một vấn đề lớn. –

Trả lời

12

Python là kiểm tra từng phần tử của từ điển một cách đệ quy để đảm bảo sự bình đẳng. Xem C dict_equal() implementation, kiểm tra từng khóa và giá trị (miễn là từ điển có cùng độ dài); nếu từ điển b có cùng một khóa, thì hãy kiểm tra PyObject_RichCompareBool nếu các giá trị khớp với nhau; đây thực chất là một cuộc gọi đệ quy.

Từ điển không thể bẻ khóa vì __hash__ attribute is set to None và hầu hết tất cả chúng đều là có thể thay đổi, không được phép khi được sử dụng làm khóa từ điển.

Nếu bạn sử dụng từ điển làm khóa và thông qua tham chiếu hiện tại, hãy thay đổi khóa, khi đó khóa đó sẽ không còn vị trí vào cùng một vị trí trong bảng băm. Sử dụng từ điển khác, bằng từ điển (bằng từ điển không thay đổi hoặc từ điển đã thay đổi) để thử và lấy lại giá trị bây giờ sẽ không còn hoạt động vì không chọn đúng vị trí, hoặc khóa sẽ không còn bằng nhau nữa.

2

Từ điển là bình đẳng nếu chúng có cùng khóa và cùng giá trị cho mỗi khóa.

Xem một số ví dụ:

dict(a=1,b=2)==dict(a=2,b=1) 
False 

dict(a=1,b=2)==dict(a=1,b=2,c=0) 
False 

dict(a=1,b=2)==dict(b=2,a=1) 
True 
12

Từ docs:

Mappings (từ điển) so sánh bằng khi và chỉ khi sắp xếp (key, value) danh sách của họ so sánh bằng nhau. [5] Các kết quả khác ngoài bình đẳng là được giải quyết một cách nhất quán, nhưng không được xác định khác. [6]

Footnote [5]:

Việc thực hiện tính toán này một cách hiệu quả, mà không xây dựng danh sách hoặc phân loại.

Footnote [6]:

Đầu phiên bản của Python sử dụng so sánh tự từ điển của sắp xếp (giá trị quan trọng,) danh sách, nhưng điều này là rất tốn kém đối với trường hợp chung của so sánh bình đẳng.Một phiên bản trước đó của Python đã so sánh từ điển chỉ với danh tính, nhưng điều này gây ra những bất ngờ vì mọi người mong đợi có thể kiểm tra từ điển cho sự trống rỗng bằng cách so sánh nó với {}.

+3

Lưu ý rằng triển khai thực tế sử dụng thứ tự từ điển cho toán hạng bên trái và thoát ra trước nếu số lượng khóa khác nhau, sau đó ngay khi khóa không có trong dict khác hoặc giá trị được liên kết không so sánh bằng nhau. –

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