9

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

私は今日、次がpython 2.6(Cpython)を使用して動作することに気づきました...

>>> a=[100,200]
>>> a[True]
200
>>> a[False]
100

これは他のPython実装に移植可能ですか(たとえばTrueFalseintから継承することがTrue保証されていますか?他のゼロ以外の数値の代わりに1に評価されることが保証されていますか?)これが役立つ状況はありますか?三項演算子の別の形式として使用できるようですが、そこでどれだけの利益が得られるかはわかりません...

4

2 に答える 2

11

これは言語仕様の一部であるため、Pythonの実装では、整数と同等のブール値を実装する必要があります。

ブール値

これらは、真理値FalseとTrueを表します。値FalseとTrueを表す2つのオブジェクトは、唯一のブールオブジェクトです。ブール型はプレーン整数のサブタイプであり、ブール値は、ほとんどすべてのコンテキストで、それぞれ値0および1のように動作します。ただし、文字列に変換されると、文字列"False"または"True"がそれぞれ返されます。

于 2012-04-21T23:35:28.367 に答える
4

はい-これは保証されています-警告がTrueありFalse、再割り当てされる可能性があります。しかし、それはブール演算の結果には影響しません。(ドキュメンタリーの証明をしてくれたIgnacioに感謝します。)実際、三項演算子がなかったとき、これはそれをエミュレートするために使用された方法の1つでした。現在、三項演算子が必要な場合は、三項演算子を使用してください。ただし、この構成が依然として役立つ場合もあります。例えば:

>>> even_odd = [[], []]
>>> for i in range(10):
...     even_odd[i % 2 == 1].append(i)
... 
>>> print even_odd
[[0, 2, 4, 6, 8], [1, 3, 5, 7, 9]]

辞書でもこれを行うことができます。同等の三項演算子があります...

>>> even, odd = [], []
>>> for i in range(10):
...     (even if i % 2 == 1 else odd).append(i)
... 
>>> even, odd
([1, 3, 5, 7, 9], [0, 2, 4, 6, 8])

しかし、少なくともこの場合は、実際にはリストインデックスバージョンの方が読みやすいと思います。YYMV。

于 2012-04-21T23:36:42.573 に答える