false == 0とtrue == 1のpythonの実装の詳細ですか、それとも言語で保証されていますか?
-
02-10-2019 - |
質問
それは保証されていますか False == 0
と True == 1
, 、Pythonで(ユーザーによって再割り当てされていないと仮定して)?たとえば、Pythonのバージョン(既存および将来のバージョンの両方)が何であれ、次のコードが常に同じ結果を生成することを保証することは何らかの形で保証されていますか?
0 == False # True
1 == True # True
['zero', 'one'][False] # is 'zero'
公式の文書への言及は大歓迎です!
編集: :多くの答えに記載されているように、 bool
継承します int
. 。したがって、質問は次のようにリキャストすることができます。 値で 0
と 1
?」。この質問は、実装の詳細のために失敗しない堅牢なコードを書くのに関連しています!
解決
Python 2.xでは、これはです いいえ 可能な限り保証されています True
と False
再割り当てされる。ただし、これが発生したとしても、Boolean TrueとBoolean Falseは、比較のためにまだ適切に返されます。
Python 3.xで True
と False
キーワードであり、常に等しくなります 1
と 0
.
Python 2の通常の状況では、常にPython 3で:
False
オブジェクトはタイプです bool
のサブクラスです int
:
object
|
int
|
bool
あなたの例では、それが唯一の理由です ['zero', 'one'][False]
うまくいきます。リストインデックスが整数または定義するオブジェクトでのみ機能するため、整数のサブクラスではないオブジェクトでは機能しません。 __index__
方法(ありがとう マーク・ディキンソン).
編集:
現在のPythonバージョン、およびPython 3のバージョンにも当てはまります。 Python 2.6のドキュメント そしてその Python 3のドキュメント どちらも言う:
整数には2つのタイプがあります:[...]整数(int)[...] booleans(bool)
ブールサブセクション:
ブレア人:これらは真実の値を表しますfalse and true [...]ブール値はそれぞれ値0と1のように振る舞います。 「それぞれ返還されます。
もあります、 Python 2の場合:
数値のコンテキストでは(たとえば、算術演算子への引数として使用される場合)、それらはそれぞれ整数0と1のように動作します。
したがって、ブーリアンは、Python 2.6および3の整数と明示的に見なされます。
したがって、Python 4がやってくるまで安全です。 ;-)
他のヒント
Python 2.3の新しいブールタイプについて議論するPEPへのリンク: http://www.python.org/dev/peps/pep-0285/.
ブールをintに変換する場合、整数値は常に0または1ですが、intをブールに変換する場合、ブール値は0を除くすべての整数に当てはまります。
>>> int(False)
0
>>> int(True)
1
>>> bool(5)
True
>>> bool(-5)
True
>>> bool(0)
False
Python 2.xでは、まったく保証されていません。
>>> False = 5
>>> 0 == False
False
だからそれは変わる可能性があります。 Python 3.xでは、True、false、およびNoneは 予約された言葉, 、したがって、上記のコードは機能しません。
一般に、ブール人を使用すると、Falseの値は常に0のものであるが(上記のように変更しない限り)、Trueは他の値を持つ可能性があると仮定する必要があります。私は必ずしもそれを保証することに頼っているわけではありません True==1
, 、しかし、Python 3.xでは、これは常にそうです。
とてもシンプルです。 boolは整数をboolとして評価することに関係しているため、ゼロのみが誤った答えを与えます。すべての非ゼロ値、フロート、負の数を含む整数、またはあなたが何を持っているかは、真実を返します。
これが役立つ理由の良い例は、デバイスのパワーステータスを決定することです。ゼロ以外の値はゼロです。オフはゼロです。電子的に言えば、これは理にかなっています。
値の間で真またはfalseを決定するには、それを比較する何かを持っている必要があります。これは、使用して文字列と数値に適用されます ==
また !=
また <
, >
>=
, <=
, 、など
整数を変数に割り当ててから、その変数値に基づいてtrueまたはfalseを取得できます。
書くだけ int(False)
そして、あなたは得るでしょう 0
, 、入力する場合 int(True)
出力されます 1
偽はブールです。異なるタイプがあります。整数である0とは異なるオブジェクトです。
0 == False
falseが整数にキャストされるため、trueを返します。 int(false)戻ります0
==オペレーターのPythonドキュメントは(help( '=='))ということです。
オペレーター
<
,>
,==
,>=
,<=
, 、 と!=
2つのオブジェクトの値を比較します。オブジェクトには同じタイプを持つ必要はありません。両方が数字の場合、それらは共通のタイプに変換されます。
結果として、falseは比較の必要性のために整数に変換されます。しかし、それは0とは異なります。
>>> 0 is False
False