9

私が書く場合:

d = { 0:'a', 1:'b' }
d[False] = 'c'
d[True] = 'd'
print(d)

私は得る:

{ 0:'c', 1:'d' }

それらをintに強制するのはなぜですか? 逆に同じことをします。

d = {False:'a', True:'b'}
d[0] = 'c'
d[1] = 'd'
print(d)

出力は次のとおりです。

{False:'c', True: 'd'}

これを無効にすることはできますか? バグですか?

4

3 に答える 3

6

アルシャジイの答えの背景を提供するだけです。

2 つのブール値TrueFalseは、整数と奇妙な関係にあります。

一方では、それらは異なる文字列表現を持ち、別々の ID を持っています:

>>> print(True)
True
>>> print(1)
1

>>> True is 1
False

一方、それらは比較および算術演算では整数として動作します。

>>> True == 1
True
>>> True + 1
2

この動作の理由は互換性です。ずっと前に、boolタイプは存在しませんでした。「ブール」演算子は C の動作をコピーし、「false」と「true」に and を0再利用します。1

最終的に、Guido はこれがあまり意味をなさないことに気付き、私たちが知っていて大好きな定数を追加しました。

しかし、問題がありました。それでも、ブール値を整数のように扱うコードはすでにたくさんありました。ブール演算が「正しい」型を使用して開始された場合、このコードはすべて壊れます。

そこでグイドは妥協した。ブール値には独自の型 がありbool、整数とは異なる方法で表示されます。しかし、算術演算と比較、特に__eq____hash__では、それらは 1 つの同じものとして扱われます。そのため、古いコードは引き続き機能しますが、新しいコードは引き続き新しいbool型を利用できます。

多分それは Python 4 で変更されるでしょう。しかし今のところ、boolは のサブクラスであり、それとint一緒に暮らす必要があります。

(関連する注意事項として、これが、他の Python キーワードのように小文字ではなく、タイトル ケースでTrueある理由の 1 つです。)False

于 2013-11-08T04:00:35.773 に答える
6

これは、これらの値が等しいと見なされるためです。

>>> True == 1
True
>>> 
>>> False == 0
True

同じハッシュ値を持っています:

>>> hash(True), hash(1)
(1, 1)
>>> 
>>> hash(False), hash(0)
(0, 0)

したがって、辞書の観点からすると、True1は と と区別できませFalse0

これを「無効にする」方法はありません。最初から辞書で同種でないキーを使用しないでください。

この特定のケースで考えられる回避策は、TrueFalse以外の1との特別な int 値をそれぞれ予約することです (独立したキーとしてと0が必要1であると仮定します)。0たとえば、-1representTrue-2representを持つことができますFalse

于 2013-11-08T04:00:58.560 に答える
1

bool表現が「False」または「True」であるサブクラスですintが、そのは 0 または 1 です。

于 2013-11-08T04:01:18.527 に答える