かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

Python3のTrueとFalse、それからNone

PythonのboolはTrueFalse
truefalseと小文字にするとエラーになる。

  • 0, 0.0, [], {}, "", Noneはbool化するとFalse
  • Trueは、1扱いにもなる
  • Falseは、0, 0.0扱いにもなる

Bool化

bool(0)    # False
bool(0.0)  # False
bool([])   # False
bool({})   # False
bool("")   # False
bool(None) # False
bool(1)    # True
bool(2)    # True
bool(-1)   # True
  • Noneはbool化するとFalse
  • 数値は0以外はTrueになる

==

==演算子は「等価(同じ値)」かを比較する

True ==
True == True  # True
True == False # False
True == None  # False
True == 1     # True
True == 2     # False

数値は1以外はTrueにはならない

False ==
False == True  # False
False == False # True
False == None  # False
False == 0     # True
False == 0.0   # True
False == []    # False
False == {}    # False
False == ""    # False
False == -1    # False

[], {}, "", Noneはbool化するとFalseだが、Falseとは等しくない。(==Falseになる)

None ==
None == True  # False
None == False # False
None == None  # True
None == 0     # False
None == 0.0   # False
None == []    # False
None == {}    # False
None == ""    # False

Noneと等しくなるのはNoneのときだけ。

is

is演算子は「同一のオブジェクトか」を判定する

True is
True is True # False
True is 1    # False

==ではTrueになるTrue1is演算子で比較するとFalse

False is
False is False # False
False is 0     # False
False is 0.0   # False

Falseも同様に==ではTrueになるFalse, 0is演算子ではFalse

None is
None is None # False

Noneも同様。None is NoneFalseになる

int化

int(True)  # 1
int(False) # 0
int(None)
# TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'

True1False0int(None)はエラーになる。

暗黙の型変換?が行われる処理だと、True1False0として扱われる

True > False # true
3 + true     # 4
"7" - False
# => TypeError: unsupported operand type(s) for -: 'str' and 'bool'

数値にTrueを足すのは+1と同じ扱いになる。
javascriptのように- 0で数値化はできない。

PythonTrueFalseRubyfalsenilの時だけfalseで後はtrueに比べて、ちょっと複雑でした。
特にbool(2)Trueだけど、2 == TrueFalseとかはちょっと紛らわしい...


[参考]

初めてのコンピュータサイエンス

初めてのコンピュータサイエンス