web-dev-qa-db-ja.com

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

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

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

公式ドキュメントへの参照は大歓迎です!

編集:多くの回答で述べたように、boolintを継承します。したがって、「プログラマは整数から継承するブール値に依存することができると公式に述べているドキュメントでは、0および1 ??」この質問は、実装の詳細のために失敗しない堅牢なコードを書くことに関連しています!

226
Eric O Lebigot

Python 2.xでは、TrueFalseが再割り当てされる可能性があるため、これは保証されません。ただし、これが発生しても、比較のためにブール値のTrueとブール値のFalseが正しく返されます。

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

Python 2の通常の状況下で、そして常にPython 3の中では:

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

object
   |
 int
   |
 bool

あなたの例で['zero', 'one'][False]がうまくいく理由はそれだけです。これは、整数のサブクラスではないオブジェクトでは動作しません。リストのインデックス付けは整数、または __index__ メソッドを定義するオブジェクトでのみ動作するからです(thanks mark-dickinson )。 。

編集する

現在のPythonバージョン、そしてPython 3にも当てはまります。 python 2.6のdocsPython 3のdocs はどちらもこう言います:

整数には2つのタイプがあります。[...] Integers(int)[...] Booleans(bool)

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

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

Python 2用 :もあります

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

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

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

164
Olivier Verdier

Python 2.3の新しいbool型について議論しているPEPへのリンク: http://www.python.org/dev/peps/pep-0285/

ブール値を整数値に変換する場合、整数値は常に0または1ですが、整数値をブール値に変換する場合、ブール値は0以外のすべての整数に対してTrueになります。

>>> int(False)
0
>>> int(True)
1
>>> bool(5)
True
>>> bool(-5)
True
>>> bool(0)
False
70

Python 2.xでは、まったく保証されていません。

>>> False = 5
>>> 0 == False
False

それで、それは変わるかもしれません。 Python 3.xでは、True、False、およびNoneは 予約語 なので、上記のコードは機能しません。

一般に、ブール値では、Falseは常に整数値0を持ちますが(上記のように変更しない限り)、Trueは他の値を取り得ると想定する必要があります。私は必ずしもTrue==1の保証に頼る必要はありませんが、Python 3.xでは、これは常に当てはまります。

22
Daniel G