khi tạo một bộ:Tại sao bộ python giữ False và Zero độc quyền?
>>> falsey_set = {0, '', False, None} # set([False, '', None])
>>> falsey_set = {False, '', 0, None} # set([0,'', None])
>>> # adding an item to the set doesn't change anything either
>>> falsey_set.add(False) # set([0,'',None])
hoặc một cuốn từ điển, mà bắt chước hành vi hơi:
>>> falsey_dict = {0:"zero", False:"false"} # {0:'false'} # that's not a typo
>>> falsey_dict = {False:'false', 0:'zero'} # {False: 'zero'} # again, not a typo
>>> falsey_set.add(()) # set([0,'', None,()])
>>> falsey_set.add({})
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
>>> falsey_dict[()] = 'list' # {False:'zero',():'list'}
>>> falsey_dict({}) = 'dict'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
0
và False
luôn loại bỏ một số khác từ các thiết lập. Trong trường hợp từ điển chúng không chính xác hoàn toàn. Có lý do nào cho số này không? Trong khi tôi nhận ra rằng boolean có nguồn gốc từ số nguyên trong Python. Lý do pythonic cho hành động theo cách này trong bối cảnh của bộ đặc biệt là gì (Tôi không quan tâm đến từ điển quá nhiều)? Kể từ khi hữu ích trong việc so sánh truthy như:
>>> False == 0 # True
Có giá trị rõ ràng trong sự khác biệt:
>>> False is 0 # False
Tôi đã nhìn qua documentation và dường như không thể tìm thấy một tài liệu tham khảo cho các hành vi
cập nhật
@de lnan Tôi nghĩ rằng bạn đánh vào đầu móng với định nghĩa băm mà bạn đã đề cập trong phần bình luận. Như @mgilson lưu ý cảFalse
và 0
sử dụng chức năng tương tự băm, tuy nhiên để làm object
và nhiều người trong lớp con của nó (nghĩa là .: super
) có giống hệt băm chức năng. Khóa có vẻ nằm trong cụm từ Hashable objects which compare equal must have the same hash value
từ số documentation. Vì, False == 0 và cả hai đều có thể bẻ khóa, kết quả đầu ra của chúng phải theo định nghĩa của Python là tương đương. Cuối cùng, định nghĩa của hashable cho biết bộ sử dụng tính băm trong thành viên đã đặt như sau: Hashability makes an object usable as a dictionary key and a set member, because these data structures use the hash value internally.
Mặc dù tôi vẫn không hiểu tại sao cả hai đều sử dụng cùng chức năng băm - tôi có thể giải quyết vấn đề này.
Nếu tất cả chúng tôi đồng ý thì ai đó đề xuất câu trả lời được đánh bóng và tôi sẽ chấp nhận câu trả lời đó. Nếu có thể có một số cải tiến hoặc nếu tôi rời khỏi cơ sở thì hãy để nó được biết dưới đây.
Tại sao danh tính lại quan trọng? Hai chuỗi bằng nhau có thể có các định danh khác nhau, hãy tưởng tượng nỗi đau nếu chúng được xem là khác biệt bởi các bộ và chữ cái. Cũng lưu ý rằng theo định nghĩa của hashability, 'hash (x) == hash (y)' ** phải ** giữ khi 'x == y'. – delnan
Câu hỏi liên quan: http://stackoverflow.com/questions/2764017/is-false-0-and-true-1-in-python-an-implementation-detail-or-is-it-guarante. –
Bạn không nên quá treo lên phần băm của điều này; nó hầu như không liên quan.Câu trả lời đơn giản là dict và set (và list, come to that) thành viên dựa trên * equality * (trừ khi bạn muốn nitpick, trong trường hợp đó mô tả tốt hơn là identity-then-equality), và vì 'False == 0', chúng được coi là giống nhau khi được sử dụng làm yếu tố thiết lập hoặc các phím từ điển. Thực tế là các dicts và các bộ sử dụng một bảng băm (và do đó các phím và các phần tử phải được hashable, và bình đẳng nên ngụ ý bình đẳng của băm) là thứ yếu. –