PR

【Python】if文のスコープに注意

Python
記事内に広告が含まれています。

どの言語でもスコープには注意する必要がありますが、Pythonは比較的簡単にコードが書けるからこそスコープの扱いに注意が必要になります。

この記事では、意外とややこしいと思われるif文のスコープに着目して説明します。

環境

  • Python: 3.11.2

if文の内側と外側でスコープが変わらない

まずは、以下のコードと結果を見てみましょう。

num1 = 1

if num1 == 1:
    num1 = 2
    print(num1)
    # 2

print(num1)
# 2

if文の外側でnum1に1が入っており、内側で2が再代入されています。
if文の内側はもちろん2が出力されますが、外側でも2が出力されていますね。
すなわち、if文の内側と外側でスコープが変わっていません

Pythonから始めた方は違和感がないかもしれませんが、私はPythonより先にJavaScriptでletconstを使用してコードを書いていたので違和感がありました。

応用編

応用編として、その他注意が必要な例を説明します。

if文の内側で変数を定義し、処理が通る場合

if文の内側で初めて定義された変数を、if文の外側から参照することが可能です。

num1 = 1

if num1 == 1:
    num10 = 10
    print(num10)
    # 10

print(num10)
# 10

if文の内側で定義したnum10が外側からも参照できていますね。

if文の内側で変数を定義し、処理が通らない場合

先程とは異なり、if文の内側の処理を通らず外側から参照された場合です。
この場合は、変数が定義されていない旨のエラーが出力されます

num1 = 2

if num1 == 1:
    num10 = 10
    print(num10)

print(num10)
"""
Traceback (most recent call last):
  File "/root/src/scope_if.py", line 8, in <module>
    print(num10)
          ^^^^^
NameError: name 'num10' is not defined. Did you mean: 'num1'?
"""

まとめ

Pythonのif文に関するスコープについて説明しました。
for文もif文と同様にスコープを形成しないので、気になる方は試してみてください。

また、スコープの扱いは言語によって異なる場合があるので、スコープに気を配りながらコードを書くことが大切です。

コメント

タイトルとURLをコピーしました