どの言語でもスコープには注意する必要がありますが、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でlet
やconst
を使用してコードを書いていたので違和感がありました。
応用編
応用編として、その他注意が必要な例を説明します。
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文と同様にスコープを形成しないので、気になる方は試してみてください。
また、スコープの扱いは言語によって異なる場合があるので、スコープに気を配りながらコードを書くことが大切です。
コメント