1. ホーム
  2. python

[解決済み] なぜboolはintのサブクラスなのですか?

2023-03-30 08:32:20

質問

python-memcachedを通してmemcachedにboolを格納するとき、それが整数として返されることに気づきました。ライブラリのコードをチェックすると、以下の場所があることがわかりました。 isinstance(val, int) がチェックされ、値が整数であることをフラグしていることがわかりました。

そこで、pythonのシェルでテストしてみたところ、以下のことに気がつきました。

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

しかし、なぜ bool のサブクラスである int ?

booleanは基本的に2つの値を取ることができるintでありながら、実際の整数よりもはるかに少ない演算とスペースしか必要としない(演算なし、1ビットのストレージスペースのみ)ので、それはちょっと意味があります...。

どのように解決するのですか?

のコメントから http://www.peterbe.com/plog/bool-is-int

<ブロッククオート

Pythonにbool型が追加された頃(2.2か2.3の頃)にいたのなら、完全に論理的な話です。 が追加された時 (2.2 か 2.3 の頃) にいたなら、完全に論理的です。

実際のbool型が導入される以前は、0と1が真理値の公式表現でした。 C89 と同様に、0 と 1 が公式の真理値表現でした。C89 と同様に 理想的ではないが動作しているコードを不必要に壊さないために、新しいbool型は0と1のように動作する必要がありました。 これは単に真理値だけではありません。 のように動作する必要があります。誰もbool型の結果を数値の文脈で使うことを勧めないでしょう。 の結果を数値のコンテキストで使用することを推奨する人はいませんし、ほとんどの人は、真偽値を決定するために 真理値を決定するために等号をテストすることを推奨する人はいません。 既存のコードがどれだけそのようなものであるか、誰も苦労して見つけようとはしませんでした。そこで 真と偽はそれぞれ1と0に見せかけることにしました。これは単に 言語進化の歴史的な産物に過ぎません。

この素敵な説明のためにdman13に謝意を表します。