Python:ローカル変数とグローバル変数

Python

Pythonのローカル変数グローバル変数について説明します。
独自の関数を作ったプログラムを作る場合などは特に押さえておきたい内容です。

Pythonでは変数への代入式(a=1など)が変数宣言を表します。これは扱いやすい反面、他のプログラミング言語にあるような変数の適用範囲(スコープ)についてあまり考えずにつかってしまいがちです。実際はPythonにもローカル変数(狭い範囲で利用できる変数)とグローバル変数(プログラム全体で利用できる変数)があります。

ローカル変数の例(プログラムエラー例)

以下の関数subで定義した変数xは、関数sub内でのみ有効な変数(=ローカル変数として扱われます。このプログラムは実行するとエラーが出ます。

57_local_hensu.py

# ローカル変数

def sub():
    x = 10  # ローカル変数: 関数sub内でのみ有効
    print("関数内: x = {}".format(x))

sub()
print("x = {}".format(x))

実行イメージ(実行途中でエラーとなる)

sub: x = 10
Traceback (most recent call last):
File “d:/Dropbox/Python/local_hensu.py”, line 8, in
print(“x = {}”.format(x))
NameError: name ‘x’ is not defined

エラーメッセージの「name ‘x’ is not defined」をそのまま訳せば、「xという名前が見つかりません」となります。関数sub内で初めて用いた変数は、関数subでのみ有効なローカル変数となります。

グローバル変数を参照する

Pythonでは、関数の外側で最初に用いた変数は全てグローバル変数として扱われます。
グローバル変数は関数の内外を意識することなく利用できます。

実行イメージ

関数内: x = 999
x = 999

58_global_hensu1.py

# グローバル変数1

def sub():
    print("関数内: x = {}".format(x))  # グローバル変数のxを表示

x = 999  # グローバル変数を定義: 関数以外での定義は全てグローバル変数となる
sub()
print("x = {}".format(x))

解説

変数xは関数subの外側で定義されている為(6行目)、関数subでも同じ999が表示(4行目)されます。

グローバル変数への代入

例えば、関数の内側と外側で同じ変数名に代入をした場合関数内ではローカル変数関数の外ではグローバル変数として扱われます。
以下をご覧ください。

実行イメージ

関数内: x = 100
x = 999

59_global_hensu2.py

# グローバル変数2 値の代入

def sub():
    x = 100  # 関数subのローカル変数x
    print("関数内: x = {}".format(x))

x = 999  # グローバル変数を定義: 関数以外での定義は全てグローバル変数となる
sub()
print("x = {}".format(x))

4行目の x = 100ローカル変数(関数subでのみ有効な変数)となります。
7行目 x = 999 は、グローバル変数となります。

もし、上記の関数subの中でグローバル変数xに代入したい場合、関数の中でグローバル変数を扱うことを明示します。次をご覧ください。

関数の中でグローバル変数に代入したい場合の記述

結論から言うと関数の中で代入したい場合、変数名の前にglobalをつけて宣言します。

例) global x    … ここではグローバル変数 x に代入をするという意味

実際のプログラムです。

60_global_hensu3.py

# グローバル変数3 値の代入

def sub():
    global x  # グローバル変数に代入するために必要
    x = 10  # グローバル変数xに10を代入
    print("関数内: x = {}".format(x))

x = 999  # グローバル変数を定義: 関数以外での定義は全てグローバル変数となる
sub()
print("x = {}".format(x))  # 関数sub内でグローバル変数xの値が変更されたたため10が表示される

実行イメージ

関数内: x = 10
x = 10

関数内でglobal x と宣言したことで、グローバル変数xに関数内で代入が可能となります。

まとめ

関数内で宣言した変数は全てローカル変数
・関数の内と外で同じ変数名の代入をすると関数内でのローカル変数として扱われる
グローバル変数に関数内で代入したい時は global 宣言を使う

コメント

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