あとりえSoeru

あとりえSoeruのブログ記事「結局Falseと空文字とNoneはイコールなの?違うの?」です。

あとりえSoeruのつぶやきブログ

結局Falseと空文字とNoneはイコールなの?違うの?

2018年11月16日

前々回の勉強の時に空文字はFalseでもなくNoneでもないと書きました。
ですが、前回の記事のように真偽判定では3つ全てが偽として使えます。
結局None=False=0なの?違うの?という疑問がわきましたので検証してみました。

var = 値
if(条件文):
    print('〇')
else:
    print('×')

下のテーブルの一番上の段の文字を値に、テーブルの左の文を条件文に当てはめました。

if構文の結果

条件文 0 0.0 None set() [] () {} ''
not 変数
変数 is None × × × × × × ×
変数 < 0 Error Error Error Error Error Error
変数 is False × × × × × × × ×
変数 is 0 × × × × × × ×
変数 is '' × × × × × × ×

これを見るとやっぱり全て違いますね。
ただ単に結局Falseも空文字もNoneも偽として使えるというだけのことのようです。
また、0.0と0はイコールではないという意外な結果が出ました。
そしてNoneっていったい何なの?という疑問がわいてきました。
print関数の中に数列・文字列をそれぞれ追加してみました。

print(None)

これは当たり前に表示されますね。

print(None+1)
print(None+'だよ')

これは両方ともTypeErrorが出ました。
NoneTypeには数列も文字列も追加できないそうです。
ということは、真偽判定の時に偽として使えるけれどもNoneは数列でも文字列でもないということですね。
文字列数列を足したい場合は新しいprint関数で表示させれば良いです。

じゃあFalseはどうなんだろうと思って同じように数列文字列それぞれ追加してみました。

print(False+1)
print(False+'だよ')

これもTypeErrorが出ました。
ブール型(True/False)は+演算子をサポートしていないよ、というエラー文が出ました。
ということはFalseも数列でも文字列ではないということですね。

おまけ(PHPとPython比較)

PHPだと、変数が存在するかどうか調べる時に真偽判定のように調べる時があります。

if($var){
    print('存在するよ')
}else{
    print('存在しないよ')
}

Pythonだと変数がセットされてないよとエラーが表示されプログラム自体動きません。
一応下に書いてみました。

if(var):
    print('存在するよ')
else:
    print('存在しないよ')