274

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

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

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

編集:多くの回答で指摘されているように、boolから継承しintます。したがって、質問は次のように言い換えることができます01。この質問は、実装の詳細のために失敗しない堅牢なコードを記述することに関連しています!

4

3 に答える 3

213

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

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

Python 2の通常の状況では、常にPython3の場合。

Falseオブジェクトは、次boolのサブクラスであるタイプintです。

object
   |
 int
   |
 bool

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

編集:

これは、現在のPythonバージョンとPython3のバージョンに当てはまります。Python2のドキュメントとPython3のドキュメントはどちらも次のように述べています。

整数には次の2つのタイプがあります。[...]整数(int)[...]ブール値(bool)

ブールサブセクション:

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

Python 2の場合もあります:

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

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

したがって、Python4が登場するまでは安全です。;-)

于 2010-05-04T09:18:01.243 に答える
83

Python 2.3の新しいbool型について説明しているPEPは次のとおりです:http ://www.python.org/dev/peps/pep-0285/ 。

boolをintに変換する場合、整数値は常に0または1ですが、intをboolに変換する場合、ブール値は0を除くすべての整数でTrueになります。

>>> int(False)
0
>>> int(True)
1
>>> bool(5)
True
>>> bool(-5)
True
>>> bool(0)
False
于 2010-05-04T09:16:50.583 に答える
22

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

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

だからそれは変わるかもしれない。Python 3.xでは、True、False、Noneは予約語であるため、上記のコードは機能しません。

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

于 2010-05-04T09:33:16.840 に答える