Python PR

【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なんて名前は定義されてない」っと怒っています。

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

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

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

が異なります。

グローバル変数の注意点

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

名前空間とスコープについて

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

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

# グローバル変数
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のローカル変数とグローバル変数について解説しました。

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

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