Từ các tài liệu :
đảo ngược ( seq )
Trả lại một ngược lại iterator
. seq phải là một đối tượng có __reversed__()
phương thức hoặc hỗ trợ giao thức chuỗi ( __len__()
phương thức và __getitem__()
phương thức có đối số nguyên bắt đầu từ 0).
Một dict
đối tượng không thực hiện __reversed__
. Nó thực hiện cả hai phương pháp sau. Tuy nhiên, __getitem__
lấy các khóa làm đối số, thay vì số nguyên (bắt đầu từ 0).
Về lý do, điều này đã được đề xuất và thảo luận ở đây .
BIÊN TẬP:
Các trích dẫn này được lấy từ danh sách gửi thư của Python-Dev (chủ đề "Thêm phương thức __Vversed__ cho dict", bắt đầu vào ngày 25. 05. 18), tôi sẽ bắt đầu với các đối số "khái niệm", đầu tiên là từ Antoine Pitrou:
Không có gì đáng để OrderedDict hỗ trợ đảo ngược (). Đối số có thể đi cả hai cách:
dict tương tự như OrderedDict ngày nay, vì vậy nó cũng hỗ trợ đảo ngược ();
bạn có thể sử dụng OrderedDict để báo hiệu rõ ràng rằng bạn quan tâm đến việc đặt hàng; không cần thêm bất cứ điều gì để dict.
Tôi nghĩ rằng thứ tự chèn được đảm bảo cho các dicts thông thường là hoàn toàn mới, vì vậy sẽ mất một thời gian để khái niệm ổn định và trở thành một phần của suy nghĩ hàng ngày về các dicts. Một khi điều đó xảy ra, có lẽ không thể tránh khỏi các trường hợp sử dụng sẽ xuất hiện và __Vversed__ sẽ được thêm vào một lúc nào đó. Việc thực hiện có vẻ đơn giản và nó không phải là một bước nhảy vọt về mặt khái niệm để mong đợi rằng một bộ sưu tập có trật tự hữu hạn sẽ có thể đảo ngược.
Tiếp theo là trả lời của Raymond Hettinger:
Cho rằng các dicts hiện theo dõi thứ tự chèn, có vẻ hợp lý khi muốn biết các phần chèn gần đây nhất (nghĩa là lặp qua các tác vụ được thêm gần đây nhất trong một lệnh tác vụ). Các trường hợp sử dụng có thể khác sẽ có khả năng tương ứng với cách chúng ta sử dụng lệnh đuôi Unix.
Nếu những trường hợp sử dụng đó phát sinh, sẽ rất tốt nếu __Vversed__ đã được hỗ trợ để mọi người sẽ không muốn thực hiện một cách giải quyết xấu xí bằng cách sử dụng các cuộc gọi popitem () sau đó là các cuộc gọi lại.
Mối quan tâm chính được thể hiện trong danh sách gửi thư là điều này sẽ làm tăng quá nhiều sự phình to hoặc giảm hiệu quả bộ nhớ (phải có danh sách liên kết đôi thay vì danh sách liên kết đơn) trong ít nhất một số triển khai, đây là trích dẫn của Inada Naoki từ trình theo dõi lỗi Python ( số 33462 ):
"Có một đơn đặt hàng" không có nghĩa là "đảo ngược". Ví dụ, danh sách liên kết đơn được sắp xếp, nhưng không thể đảo ngược.
Mặc dù triển khai CPython có thể cung cấp hiệu quả __reverse__
, nhưng việc thêm __reverse__
có nghĩa là tất cả việc triển khai Python được dự kiến sẽ cung cấp cho nó. Ví dụ, một số triển khai Python có thể thực hiện dict với hashmap + danh sách liên kết đơn. Nếu __reverse__
được thêm vào, nó không thể thực hiện được nữa.
Quay lại danh sách gửi thư, đây là hai tin nhắn cuối cùng (cả hai được đăng vào ngày 08/06/2012). Đầu tiên là từ Michael Selik:
Tôi có đúng không khi nói rằng sự đồng thuận là +1 để đưa vào v3.8?
Điểm cuối cùng trong chuỗi là INADA Naoki nghiên cứu các triển khai khác nhau và quyết định rằng có thể đưa tính năng này vào 3.8. Theo tôi hiểu, Guido đã đồng ý với lời khuyên của INADA để chờ đợi triển khai phiên bản 3.7 của MicroPython. Vì INADA đã thay đổi suy nghĩ, tôi đoán tất cả đều có lợi?
Kết luận với thông điệp của Guido van Rossum:
Điều đó nghe có vẻ đúng với tôi. Sau đó chúng tôi sẽ có hai phiên bản trong trường hợp này:
Như đã lưu ý trong câu trả lời và nhận xét khác, reversed()
được hỗ trợ cho cả bản chính và bản chính tả kể từ phiên bản 3.8 (14.10.2018).
dict
vật thể bình thường (ít nhất là không được bảo đảm từ ngôn ngữ) nênreversed
cũng không có ý nghĩa gì