2012-03-24 44 views
10

phép nói rằng bạn có một bộ:Set Popping (Python)

foo = {1, 2, 3, 4, 5} 

Trong cuốn sách Tôi hiện đang đọc, Pro Python, nó nói rằng việc sử dụng foo.pop() sẽ bật một số bất kỳ từ lựa chọn đó. NHƯNG ... Khi tôi thử nó, nó pops 1, then 2, then 3... Liệu nó có làm điều đó một cách tùy tiện, hay đây chỉ là sự trùng hợp ngẫu nhiên?

+0

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. –

+0

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 –

Trả lời

16

Lý do nó nói tùy ý là vì không có bảo đảm về thứ tự nó sẽ xuất hiện. Vì bạn vừa tạo tập hợp, nó có thể lưu trữ các phần tử theo thứ tự "đẹp", và do đó .pop() xảy ra để trả lại chúng theo thứ tự đó, nhưng nếu bạn thay đổi tập hợp, điều đó có thể không tiếp tục giữ.

Ví dụ:

>>> foo = set() 
>>> foo.add(-3) 
>>> foo.add(-1) 
>>> foo.add(2) 
>>> foo.pop() 
2 
>>> foo.pop() 
-3 
14

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 :-)