Pythonの辞書(dict)キーにはHashableなオブジェクトが使え、hash値をキーに使用します。
Pythonのbool型はint型のサブクラスとして実装されており、False は 0 と、True は 1 と同じhash値になっています。
>>> hash(0)
0
>>> hash(False)
0
>>> hash(1)
1
>>> hash(True)
1
では、0, 1, False, True を辞書キーとして使うとどうなるかを見てみます。
>>> d = { 0: 'zero', True: 'true' }
>>> d
{0: 'zero', True: 'true'}
>>> d[0]
'zero'
>>> d[True]
'true'
>>> d[False]
'zero'
>>> d[1]
'true'
辞書にない False と 1 も取得できてしまいました。
ハッシュ値が同じなので、当然といえば当然な挙動です。
辞書に代入してみます。
>>> d
{0: 'zero', True: 'true'}
>>> d[False] = 'false'
>>> d[1] = 'one'
>>> d
{0: 'false', True: 'one'}
キーは 0 と True のまま、値が 'false' と 'one' に更新されました。
キーは最初に代入したときの値が使われ、値は最後に代入した値になることがわかりました。
当然と言えば当然ですが、興味深い結果でした。
>>> d = { 0: '零', True: '真', 1: '壱', False: '偽'}
>>> d
{0: '偽', True: '壱'}
追記:
公式ドキュメントに書いてありました。
比較した際に等しいとみなされる値 (例えば 1 と 1.0 と True) は、どれを使っても同じエントリーに関連付けられます。