Set và từ điển được thực hiện sử dụng bảng băm. Chúng là những bộ sưu tập không có thứ tự, có nghĩa là chúng không có trật tự được bảo đảm.
Đơn đặt hàng bạn thấy là chi tiết triển khai không được bảo đảm. Trong CPython, giá trị băm cho một số nguyên là số nguyên chính nó:
>>> [hash(i) for i in range(10)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Chi tiết triển khai đó làm cho số nguyên xuất hiện trong bộ của bạn. Các bộ khác sẽ được đặt hàng, {5, 6, 7, 8, 9}
xuất hiện dưới dạng set([8, 9, 5, 6, 7])
.
Ngược lại, các kiểu dữ liệu khác như str có hàm băm khác nhau và sẽ xuất hiện nhiều tranh giành hơn. Ví dụ:
# Example of scrambling str objects in a 64-bit build
>>> {'red', 'green', 'blue'}
set(['blue', 'green', 'red'])
Các set.pop phương pháp bật tắt các mục từ trái sang phải. Đó cũng là một chi tiết triển khai không được bảo đảm.
Câu trả lời ngắn cho câu hỏi của bạn là Có, thứ tự là tùy ý nhưng Không, những gì bạn thấy không chỉ là trùng hợp ngẫu nhiên, mà là một chi tiết triển khai không được đảm bảo thú vị.
Hy vọng điều này xóa lên những bí ẩn cho bạn :-)
này đã làm với các hàm băm mà một bộ sử dụng để lập bản đồ nội dung của nó đến các địa điểm trong bộ nhớ. Hãy thử thực hiện 'hash()' trên các kiểu dữ liệu khác nhau và xem những con số nào bạn nhận được. Số arbritrary xuất hiện trong tập hợp _will_ là phần tử _next_ trong tập hợp. Nó chỉ như vậy sẽ xảy ra rằng "thứ tự" các thiết lập lưu trữ dữ liệu có thể không _necessarily_ được đặt hàng như xa như bạn đang quan tâm. Trong ví dụ này, thứ tự các phần tử đang xảy ra trùng với thứ tự mà hashmap được lưu trữ/lấy ra. –
Tôi đã tìm thấy điều tương tự hôm nay và tôi muốn đưa ra câu hỏi của bạn –