文系出身でもPython勉強中のtsenです。
今回は、Pythonのスコープについてまとめていきます。
Pythonのローカルスコープとは
スコープとは、「有効範囲」のことです。
Pythonでは、変数名を記述すればその変数をすぐに利用できますが、
関数内で変数に値を代入した場合、その変数は代入を行った関数の中でのみ有効です。
このように有効範囲が関数内のみに限定されている変数のようなものを
ローカルスコープと言います。
次のコードで、ローカル変数の確認をしてみます。
def pokemon() :
p= "ぴかちゅー"
print(f'pokemon の p は {p} です')
pokemon()
このコードを実行すると、
pokemon の p は ぴかちゅー です
という結果が返ります。
次に、pokemon関数の外から 変数 p へアクセスしてみます。
print(f'p は {p} です')
するとエラーになり、変数 pが関数の外から使えないことが分かります。
このように、関数の中で利用している変数(ローカルスコープの変数)へ
関数外部からアクセスすることはできません。
Pythonのグローバルスコープとは
関数の中ではなく「外」で値を代入した変数を、「グローバルスコープ」と呼びます。
グローバル変数は、関数や他のモジュールからもアクセスできます。
ただし、関数内からではグローバル変数は「参照のみ」で、代入はできません。
次のコードで確認してみましょう。
p = "ぴかちゅー"
def pokemon2() :
print(p)
pokemon2()
このp=”ぴかちゅー”という部分がグローバルスコープ(グローバル変数)にあたります。
これを実行すると
ぴかちゅー
という結果が返ります。
ここで、pという変数に違う値を代入しようとしてもエラーになります。
p = "ぴかちゅー"
def pokemon2() :
print(p)
p ="ひとかげ"
pokemon2()
もし関数内でグローバル変数に値を代入したい場合は、
global キーワードで変数を宣言する必要があります。
p = "ぴかちゅー"
def pokemon2() :
global p
p ="ひとかげ"
pokemon2()
print(p)
このようにグローバル宣言をすると、pにはひとかげが代入され、結果はひとかげが返ってきます。
ひとかげ
スコープのメリット・デメリット
一見すると参照範囲が広い「グローバル変数」は使い勝手がいいように思いますが
様々な関数から見えるという便利さのメリットがある一方で
参照範囲が広くなる分だけ扱いが難しくなるというデメリットもあります。