False == 0 および True == 1 は実装の詳細ですか、それとも言語によって保証されていますか? 質問する

False == 0 および True == 1 は実装の詳細ですか、それとも言語によって保証されていますか? 質問する

False == 0Python では、およびが保証されていますかTrue == 1(ユーザーによって再割り当てされていないと仮定)? たとえば、次のコードが Python のバージョン (既存のバージョンと、おそらく将来のバージョンの両方) に関係なく、常に同じ結果を生成することが何らかの形で保証されていますか?

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

公式ドキュメントへの参照があれば、大変ありがたく思います。

多くの回答で指摘されているように、boolは を継承しますint。したがって、この質問は次のように言い換えることができます。「ドキュメントには、プログラマーが値 と を持つ0整数1から継承されたブール値を利用できると正式に記載されていますか?」この質問は、実装の詳細が原因で失敗しない堅牢なコードを書く際に重要です。

ベストアンサー1

Python 2.x では、と が再割り当てされる可能性があるため、これは保証されませ。ただし、このような場合でも、比較のためにブール値の True とブール値の False が適切に返されます。TrueFalse

Python 3.x ではTrue、 と はキーワードであり、常におよび とFalse等しくなります。10

Python 2 の通常の状況では、そして Python 3 では常に次のようになります。

Falseboolオブジェクトは のサブクラスである 型ですint:

    object
       |
     int
       |
     bool

これが、あなたの例で、が機能する唯一の理由です['zero', 'one'][False]。リストのインデックスは整数、または整数を定義するオブジェクトでのみ機能するため、整数のサブクラスではないオブジェクトでは機能しません。__index__方法(ありがとうマーク・ディキンソン)。

編集:

これは現在のPythonバージョンとPython 3に当てはまります。Python 2 のドキュメントそしてそのPython 3 のドキュメント両者ともこう言う。

整数には次の 2 種類があります: [...] 整数 (int) [...] ブール値 (bool)

ブールサブセクションでは:

ブール値: これらは、真理値 False と True を表します [...] ブール値は、ほとんどすべてのコンテキストでそれぞれ値 0 と 1 のように動作しますが、例外として、文字列に変換されると、それぞれ文字列 "False" または "True" が返されます。

もあります、Python 2の場合:

数値コンテキスト(たとえば、算術演算子の引数として使用される場合)では、これら [False と True] はそれぞれ整数 0 と 1 のように動作します。

したがって、ブール値は Python 2 および 3 では明示的に整数として扱われます。

つまり、Python 4 が登場するまでは安全です。 ;-)

おすすめ記事