Pythonにおけるブール比較の混乱は、Pythonでのプログラミング学習者にとってよくある問題です。これは、Pythonが比較演算子とその戻り値を評価する方法の違いによって発生します。これは、==演算子を使用する場合など、値を比較するときに予期しない結果や混乱につながる可能性があります。このガイドでは、この問題の概要を示し、その回避方法を説明します。

1. ブール値の混乱

このコードスニペットを見て、各ステートメントの予想結果を考えてみてください。正解はいくつありますか?

'' == False
False
In [2]: if '':
   ...:     print('空文字列はTrueです')
   ...: else:
   ...:     print('空文字列はFalseです')
   ...:
空文字列はFalseです
bool('') == False
True
0 == False
True
0.0 == False
True
1 == True
True
[] == False
False
{} == False
False
set() == False
False
bool(None) == False
True
None == False
False
None == True
False
a = None
a == None
True
a is None
True


上記のように、変数が空文字列、空リスト/辞書/集合、None値ではないかどうかを確認するには、

if not variable:  # 同等: if bool(variable) is not False
    print(variable)

NoneはTrueではなく、Falseでもありません。Noneは特別な値です。

別の問題を詳しく見てみましょう

result = None
for i in range(50):
    if i % 99 == 0:
        result = i
        break
if result:
    print(result)
print(result)

出力 

0

ここでの問題は?

それはif result.におけるブール比較の問題です。最初にresultをNoneで初期化したので、99で割り切れる数が見つかった場合、resultはNoneではないと予想されます。答えは0です。

したがって、正しい解決策は

result = None
for i in range(50):
    if i % 99 == 0:
        result = i
        break
if result is not None:
    print(result)

出力 

0