Python

【Python】グローバル変数とローカル変数とは?

この記事では、Pythonのグローバル変数とローカル変数について解説します。この変数の違いは、「関数内で宣言された変数」か、「関数外で宣言された変数」かの違いですが、これによって呼び出せる範囲が変わってきます。

グローバル変数とは?

グローバル変数とは、関数外で宣言された変数のことを言います。グローバル変数は、どこからでもアクセスすることができます。

宣言

関数の外側で変数を宣言することで、グローバル変数として宣言できます。

# グローバル変数
var = 0

def func():
    pass

呼び出せる範囲

グローバル変数はどこからでもアクセスできます。

# グローバル変数
var = 0

def func():
    # 関数内からのアクセス
    print(var)

func()
>> 0

# 関数外からのアクセス
print(var)

実行結果

0

注意

以下のように、グローバル変数にアクセスするとエラーが発生します。

var = 'global変数'

def func():
    print(var)
    var = '変更'

func()

実行結果

UnboundLocalError: local variable 'var' referenced before assignment

エラーの内容を見てみると「UnboundLocalError: local variable ‘var’ referenced before assignment」と言ってますね。このエラーは「値を割り当てる前にローカル変数のvarを参照してますよ!」っと怒っています。

Pythonではオブジェクトが後でバインドされることを認識しており、上記のアクセス方法ではまだ値がバインドされていない新たなローカル変数にアクセスしてしまいます。

グローバル変数を書き換える方法は後述します。

ローカル変数とは?

ローカス変数とは、関数内で宣言された変数のことを言います。ローカル変数は、宣言された関数内でしかアクセスできません。

宣言

関数の内側で変数を宣言することで、ローカル変数として宣言できます。

def func():
    # ローカル変数
    var = 0

呼び出せる範囲

ローカル変数は、宣言した関数内でしかアクセスできません。

def func():
    # ローカル変数
    var = 0

    # 関数内からのアクセス
    print(var)


func()  # 0
print(var)  # NameError: name 'var' is not defined

関数外からローカル変数にアクセスしようとすると「NameError: name ‘var’ is not defined」というエラーが発生します。

このエラーは「varなんて名前は定義されてない」っと怒っています。

グローバル変数とローカル変数の違い

結論として、グローバル変数とローカル変数は

『アクセスできる範囲(スコープ)』

が異なります。

グローバル変数の注意点

グローバル変数は、宣言されたら任意で削除するか、プログラム終了までずっと保持されます。そのため、グローバル変数を多く宣言してしまうと、その分メモリを消費するプログラムになってしまうので、使用は最小限に留めておきましょう!

【Python】名前空間とスコープについてこの記事では、Pythonの名前空間とスコープについて解説します。 名前空間(namespace)とは 名前空間とは、変数が所属して...

グローバル変数を関数内で書き換える

グローバル変数を関数内で普通に書き換えようとしても、書き換えることができません。

# グローバル変数
var = 0

def func():
    # グローバル変数を書き換えようとする
    var = 1
    print(var)

func()  # 1
print(var)  # 0

関数内でグローバル変数を書き換えているかに見えますが、新たにローカル変数であるvarを宣言しているに過ぎません。

グローバル変数を関数内で書き換えるには、関数の先頭でglobalキーワードを使って再宣言する必要があります。

var = 0

def func():
    # グローバル変数を再宣言
    global var
    # グローバル変数の書き換え
    var = 1
    print(var)

func()  # 1
print(var)  # 1

globalを使って明示的に宣言することで「この関数内で使用するその名前の変数はグローバルから引っ張ってくるよ!」と知らせることができます。

同じ名前の変数の優先順位

以下のように、同じ名前のグローバル変数とローカル変数が宣言されている場合に優先される変数はどちらでしょうか?

var = 0

def func():
    var = 1
    print(var)  # ここで呼び出される変数

func()

答えは「ローカル変数」です。

グローバル変数と同じ名前のローカル変数を宣言してしまうと「グローバル変数にアクセスしているつもりがローカル変数だった!」なんてことになりかねないので注意しましょう!

まとめ

この記事では、Pythonのローカル変数とグローバル変数について解説しました。

グローバル変数とローカル変数を意識していないと思わぬバグを引き起こす可能性があります。この機会にしっかり覚えておきましょう!

それでは今回の内容はここまでです!ではまたどこかで〜( ・∀・)ノ

最短3か月でエンジニア転職『DMM WEBCAMP COMMIT』