2012-05-02 30 views
9

Tôi không thể thêm số nguyên 1 vào một tập hợp hiện có. Trong một trình bao tương tác, đây là những gì tôi đang làm:Việc thêm số 1 vào bộ không có hiệu lực

>>> st = {'a', True, 'Vanilla'} 
>>> st 
{'a', True, 'Vanilla'} 
>>> st.add(1) 
>>> st 
{'a', True, 'Vanilla'} # Here's the problem; there's no 1, but anything else works 
>>> st.add(2) 
>>> st 
{'a', True, 'Vanilla', 2} 

Câu hỏi này được đăng cách đây hai tháng, nhưng tôi tin rằng nó đã bị hiểu lầm. Tôi đang sử dụng Python 3.2.3.

+5

Tại sao bạn sẽ cố gắng để lưu trữ sự thật giá trị, chuỗi, và số trong một bộ? Bạn đang cố giải quyết vấn đề gì? –

Trả lời

13
>>> 1 == True 
True 

Tôi tin rằng vấn đề của bạn là 1True là những giá trị như nhau, do đó 1 là "đã có trong tập".

>>> st 
{'a', True, 'Vanilla'} 
>>> 1 in st 
True 

Trong hoạt động toán học True được bản thân đối xử như 1:

>>> 5 + True 
6 
>>> True * 2 
2 
>>> 3./(True + True) 
1.5 

Mặc dù Đúng là một bool và 1 là một int:

>>> type(True) 
<class 'bool'> 
>>> type(1) 
<class 'int'> 

1 in st lợi nhuận Đúng, tôi nghĩ rằng bạn không nên có bất kỳ vấn đề với nó. Đó là một kết quả rất lạ. Nếu bạn quan tâm đến việc đọc thêm, @Lattyware trỏ đến PEP 285 giải thích vấn đề này theo chiều sâu.

+1

Thú vị rằng '1' và' True' được coi là bình đẳng khi biểu diễn của chúng hoàn toàn khác nhau. –

+1

@MarkRansom Tôi đồng ý, tôi gần như gọi đây là một lỗ hổng? Tôi rất thích nghe lời giải thích của Guido về lý do tại sao điều này xảy ra. –

+0

Tôi cho rằng nó không khác gì '1 == 1.0'. Nó chắc chắn trông kỳ lạ mặc dù. –

3

Tôi tin rằng, mặc dù tôi không chắc chắn, bởi vì hash(1) == hash(True) và cũng 1 == True rằng chúng được coi là các yếu tố giống nhau của set. Tôi không tin rằng đó là trường hợp, như 1 is TrueFalse, nhưng tôi tin rằng nó giải thích lý do tại sao bạn không thể thêm nó.

+0

Kết quả 'is' là chi tiết triển khai và không bao giờ được dựa vào. '==' là thử nghiệm thích hợp. –

+0

+1 bởi vì tương đương băm là chìa khóa ở đây, nhưng tôi đồng ý với Mark rằng những gì bạn nói về 'is' không thực sự có liên quan. '1 là 1' có thể là' False' và không vi phạm bất cứ điều gì trong tài liệu (và một cái gì đó như '300 là (299 + 1)' có lẽ sẽ cung cấp cho bạn 'False'). –

1

1 tương đương với True1 == True trả về giá trị đúng. Kết quả là việc chèn 1 bị từ chối do tập hợp không thể có bản sao.

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