14

ブール値を使用したリストのインデックス作成は正常に機能します。インデックスは整数でなければなりませんが。

コンソールで試したのは次のとおりです。

>>> l = [1,2,3,4,5,6]
>>> 
>>> l[False]
1
>>> l[True]
2
>>> l[False + True]
2
>>> l[False + 2*True]
3
>>> 
>>> l['0']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: list indices must be integers, not str
>>> type(True)
<type 'bool'>

試しl['0']てみると、 int 型がインデックスに期待されるというエラーが出力されましたが、それは明らかです。すると、リストの型も'True'being'False'Bool正常にインデックス化され、自動的に int 型に変換されて操作が実行されます。

内部で何が起こっているのか説明してください。初めて質問を投稿するので、間違いがあればお許しください。

4

4 に答える 4

21

何が起こっているかというと、ブール値は実際に整数です。True は 1、False は 0 です。Bool は int のサブタイプです。

>>> isinstance(True, int)
True
>>> issubclass(bool, int)
True

したがって、それらを整数に変換するのではなく、整数として使用するだけです。

(bool は歴史的な理由から int です。Python に bool 型が存在する前は、人々は整数 0 を false を意味し、1 を true を意味していました。したがって、bool 型を追加したとき、下位互換性を維持するためにブール値を整数にしました。これらの整数値を使用していた古いコードでは、たとえばhttp://www.peterbe.com/plog/bool-is-intを参照してください。)

>>> help(True)
Help on bool object:

class bool(int)
 |  bool(x) -> bool
 |  
 |  Returns True when the argument x is true, False otherwise.
 |  The builtins True and False are the only two instances of the class bool.
 |  The class bool is a subclass of the class int, and cannot be subclassed.
于 2012-10-04T06:46:27.413 に答える
3

Pythonにブール値がFalseありませんでしTrueた。そのため、ブール値が言語に追加された場合、下位互換性を維持するために、値 と をインタプリタでFalse整数値Trueとして扱うことができます。内部的には、 のサブクラスです。01boolint

つまり、次の式は True です。

>>> False == 0
True
>>> True == 1
True
>>> isinstance(True, int)
True
>>> issubclass(bool, int)
True

そして、あなたが見つけたように:

>>> True * 3
3

ただし、これは文字列には適用されません。

于 2012-10-04T06:48:35.820 に答える
2

...ブール値は、単純な整数のサブタイプです。

ソース

ご覧のとおり、Falseis0Trueis1です。

于 2012-10-04T06:46:44.913 に答える