#はじめに
環境については下記の通り
bash
$ python3 --version
Python 3.6.8
#if文の判定挙動
if文の条件式が複数ある場合、前から順番に処理されていく。
and演算子の場合は、一つでもFalseの条件式が見つかった時点で、
その後の条件式の判定は行われず、else部分の処理が行われる。
下記コードはif文の条件式の順番が違うだけだが、
処理結果に違いが出てくる。
test.py
l = [0] * 3
# l = [0,0,0]
print("0 <= i < 3 を先に判定する場合")
for i in range(4):
if 0 <= i < 3 and l[i] == 0:
print("i = {} 成功".format(i))
else:
print("i = {} 失敗".format(i))
print("0 <= i < 3 を後に判定する場合")
for i in range(4):
if l[i] == 0 and 0 <= i < 3:
print("i = {} 成功".format(i))
else:
print("i = {} 失敗".format(i))
出力結果はこちら。
bash
$ python3 test.py
0 <= i < 3 を先に判定する場合
i = 0 成功
i = 1 成功
i = 2 成功
i = 3 失敗
0 <= i < 3 を後に判定する場合
i = 0 成功
i = 1 成功
i = 2 成功
Traceback (most recent call last):
File "test.py", line 13, in <module>
if l[i] == 0 and 0 <= i < 3:
IndexError: list index out of range
「0 <= i < 3 を先に判定する場合」だと、
i = 3
の場合は1つ目の条件式である0 <= i < 3
の判定の時点でFalseとなり、
2つ目のl[i] == 0
の判定が行われていない。
一方、「0 <= i < 3 を後に判定する場合」だと、
l[i] == 0
の判定が1番目に行われるため、
i = 3
でlist index out of range
のエラーがでてしまう。
#おわり
サンプルコードは通るのに自分のコードは通らない・・・アルゴリズムは同じなのに・・・と苦悩した結果、発見した。
and演算子では1つでもFalseの条件がある時点でFalseとなるため、その後の条件式は処理されないようだ。
意外とこういう内容に触れている記事は少なかったようなのでまとめてみた。