5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Python - 複数条件でのif文判定挙動(順番が違うだけなのに)

Last updated at Posted at 2020-05-02

#はじめに
環境については下記の通り

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 = 3list index out of rangeのエラーがでてしまう。

#おわり
サンプルコードは通るのに自分のコードは通らない・・・アルゴリズムは同じなのに・・・と苦悩した結果、発見した。

and演算子では1つでもFalseの条件がある時点でFalseとなるため、その後の条件式は処理されないようだ。

意外とこういう内容に触れている記事は少なかったようなのでまとめてみた。

5
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?