よくあるPythonの問題 - [1] Noneとブール値の比較

By JoeVu, at: 2023年1月10日14:09

Estimated Reading Time: __READING_TIME__ minutes

Common Python Problems - [1] None and Boolean Comparison
Common Python Problems - [1] None and Boolean Comparison

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)

 

NoneTrueではなく、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
Tag list:
- Python
- Developer
- Mistake

Subscribe

Subscribe to our newsletter and never miss out lastest news.