1. ホーム
  2. パイソン

[解決済み】False == 0, True == 1 は実装の詳細か、それとも言語によって保証されているのか?

2022-04-04 03:55:40

質問

は保証されていますか? False == 0True == 1 Pythonでは(ユーザーによって再割り当てされないと仮定して)? 例えば、以下のコードは、Pythonのバージョンがどうであれ(既存のものも、おそらく将来のものも)、常に同じ結果を生み出すことが何らかの形で保証されているのでしょうか?

0 == False  # True
1 == True   # True
['zero', 'one'][False]  # is 'zero'

公式ドキュメントの参照があれば、ぜひお願いします。

編集 : 多くの回答で指摘されている通りです。 bool を継承しています。 int . したがって、この質問は次のように言い換えることができます: "ドキュメントには、プログラマが整数から継承されるブーリアンに頼ることができると公式に書かれていますか。 という値で 01 ?quot;。 この質問は、実装の詳細のために失敗することのない、堅牢なコードを書くことに関係しているのです

どのように解決するのですか?

Python 2.xでは、これは ではなく が可能であるため、保証されています。 TrueFalse を再代入する。 ただし、このような場合でも、比較のためにboolean Trueとboolean Falseは適切に返されます。

Python 3.xでは TrueFalse はキーワードであり、常に 10 .

Python 2 では通常の状況下で、Python 3 では常に。

False オブジェクトは、型 bool のサブクラスである int :

object
   |
 int
   |
 bool

それは、あなたの例では、唯一の理由です。 ['zero', 'one'][False] が動作します。なぜなら、リストインデックスは整数値か、あるいは __index__ メソッド(ありがとうございます マーク・ディキンソン ).

編集する

現在のPythonのバージョンでも、Python 3のバージョンでも同じです。その Python 2 のドキュメント Python 3 のドキュメント はどちらも言っています。

整数には2つの種類があります。[...] 整数 (int) [...] 論理値 (bool)

と、booleanのサブセクションにあります。

ブール語。これらは真理値FalseとTrueを表します[...]ブール値はほとんど全ての文脈で、それぞれ0と1の値のように振る舞います。例外は、文字列に変換されると、それぞれ"False" または "True" という文字が返ってくるということです。

もある。 Python 2用 :

数値の文脈では(例えば算術演算子の引数として使われる場合)、[False, True] はそれぞれ整数の 0 と 1 のように振る舞います。

つまり、Python 2と3ではブーリアンは明示的に整数とみなされるのです。

ということは、Python4が登場するまでは安心ですね ;-)