MENU

【Pythonを使い倒す】エラーを起こさないために理解しておきたいローカル変数とグローバル変数とは?

前回にて機能的なコードを書くために覚えておきたいコールバックを説明をしました。今回は変数のスコープを解説します。

変数のスコープとは?

変数にはスコープという概念があります。
スコープとは変数の有効範囲のことです

関数内で定義された変数をローカル変数

関数内で定義された変数をグローバル変数と言います。

ローカル変数は同じ関数内のみから参照できますがグローバル変数はどこからでも参照できます

以下はローカル変数とグローバル変数の例です。

ローカル変数とグローバル変数の例
a = 123 # グローバル変数

def showNum():
b = 456 # ローカル変数
print(a, b)

showNum()
実行結果

123 456

変数aには123という値が入っています。
この変数は関数の外で定義されていますのでグローバル変数です。

関数showNum()の中には変数bが定義されています。
bには456という値が入っていますが、これは関数の中で定義されていますのでローカル変数です。
この変数aと変数bをプリントします。

そしてこの関数showNum()を呼び出します。
プリントすると上記のような実行結果となります。
このようにグローバル変数aの中に123と、ローカル変数bの中身456が表示されました。

関数外でローカル変数を呼び出すとエラーとなる

以下のコードでは関数外でローカル変数bを参照しようとしているため、エラーが発生します。

関数外でローカル変数を呼び出すとエラーとなる
a = 123 # グローバル変数

def setNum():
b = 456 # ローカル変数

setNum()
print(a, b)
実行結果

—————————————————————————
NameError Traceback (most recent call last)
in ()
5
6 setNum()
—-> 7 print(a, b)NameError: name ‘b’ is not defined

関数setNum()ではローカル変数bに456という値を入れていますがこの関数の外で変数名に加えて変数bをプリントしようとしています。
プリントすると上記の実行結果のようにエラーが発生します。

以上のようにローカル変数は関数の外で参照することはできません

関数内でグローバル変数に値を代入すると新しいローカル変数となる

このやり方には注意が必要です。関数内でグローバル変数に値を代入しようとすると新しいローカル変数とみなされます。

以下の例では関数内でグローバル変数aに値を代入してもグローバル変数aの値は変わっていません。

関数内でグローバル変数に値を代入
a = 123

def setLocal():
a = 456
print("Local:", a)

setLocal()
print("Global:", a)
実行結果

Local: 456
Global: 123

グローバル変数aに123という値を入れていますが、関数setLocal()の中で同じ名前の変数aに456という値を入れています。
このaの値をローカルとグローバルでそれぞれプリントしてみましょう。
上記のような実行結果となります。

このようにローカルでは456という値グローバルでは123という値になりました。
関数内で定義された変数名はグローバル変数とは関係ない、新しいローカル変数とみなされますので、aに値を代入してもグローバル変数への値は変わりません。

グローバル変数の値を変更する確実な方法

グローバル変数の値を変更するためには、globalもしくはnonlocalを用いて、変数がローカルではないことを明記する必要があります

関数内でグローバル変数の値を確実に変更する
a = 123

def setGlobal():
global a # nonlocalでも可
a = 456
print("Local:", a)

setGlobal()
print("Global:", a)

実行結果

Local: 456
Global: 456

こちらのsetGlobal()関数ではglobalと書いてその後にグローバル変数の名前を書いています。
その後にaに456という値を入れています。
先ほどと同じくローカルおよびグローバルでaの値をプリントします。
プリントすると上記のような実行結果となります。

このようにLocalおよびGlobalともに456になりました。
グローバル変数aの値を関数内で変更することができました。

なおスコープの認識を間違うと意図しない不具合につながります。
関数を記述する際に変数のスコープを意識することはとても大事です。

今回は変数のスコープを解説しました。
しばしばスコープの認識違いが不具合を起こすことがありますので関数のコードを書く際はスコープに注意しましょう。

Follow Twitter Facebook Feedly
SHARE