2012-05-02 11 views
9

既存のセットに整数の1を追加できません。インタラクティブシェルでは、これは私がやっているものです:番号1をセットに追加しても効果がありません

>>> 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} 

この質問は2ヶ月前に投稿されますが、私はそれが誤解されたと信じていました。 私はPython 3.2.3を使用しています。

+5

なぜあなたは、単一のセット内の真理値、文字列、数値を格納しようとするのでしょうか?どのような問題を解決しようとしていましたか? –

答えて

13
>>> 1 == True 
True 

私はあなたの問題は1Trueが同じ値であるということですので、1が「既にセット中」であると信じています。

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

ものの真のブール値で、1がintである:数学演算True

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

自体が1として扱われ

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

1 in stためTrueを返し、私はあなたを考えますそれに問題はないはずです。それは非常に奇妙な結果です。あなたがさらに読むことに興味があるなら、@Lattywareはこの問題を深く説明するPEP 285を指しています。

+1

'1'と' True'は、その表現がまったく違っている場合、等しいと見なされます。 –

+1

@ MarkRansom私は同意する、私はほとんどこれを欠陥と呼ぶだろうか?これがなぜ起こるのか、私はGuidoの説明を聞きたいです。 –

+0

私は '1 == 1.0'と変わらないと思います。それは確かに奇妙に見えます。 –

3

hash(1) == hash(True)1 == Trueは、setで同じ要素と見なされるため、私は確信していませんが、私は信じています。 1 is TrueFalseであると私は信じられませんが、なぜそれを追加できないのかはわかります。

+0

'is'の結果は実装の詳細なので決して頼りにしてはいけません。 '=='は適切なテストです。 –

+0

+1ハッシュ同値性がここで重要なので、私はMarkと同意します。あなたが「is」について述べたことは本当に関係しません。 '1 is 1'は' False'となり、ドキュメントには何も違反しません( '300は(299 + 1)'がおそらく 'False'になります)。 –

1

1は、Trueと同等です。1 == Trueがtrueを返します。その結果、1の挿入は、セットが重複を持つことができないため、拒否されます。

関連する問題