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

Python

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

この変数の違いは、関数内で宣言された変数か、関数外で宣言された変数かの違いですが、これによって呼び出せる範囲が変わってきます。

グローバル変数とローカル変数を理解して、正しい変数の使い方を学びましょう!

グローバル変数とは?

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

宣言

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

# グローバル変数
var = 0

def func():
    pass

呼び出せる範囲

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

# グローバル変数
var = 0

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

func()

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

実行結果

0
0

ローカル変数とは?

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

宣言

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

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

呼び出せる範囲

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

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

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


func()

print(var) # エラー

実行結果

0
NameError: name 'var' is not defined

関数外からローカル変数にアクセスしようとすると「NameError: name ‘var’ is not defined」というエラーが発生します。このエラーは「varなんて名前は定義されてない」と怒られています。

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

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

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

が異なります。

グローバル変数の注意点

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

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

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

# グローバル変数
var = 0

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

func()

print(var)

実行結果

1
0

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

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

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

var = 0

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

func()

print(var)

実行結果

1
1

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

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

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

var = 0

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

func()

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

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

まとめ

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

今回のおさらい

  • グローバル変数とは? = 『関数外で宣言された変数』
  • ローカル変数とは? = 『関数内で宣言された変数』
  • グローバル変数とローカル変数の違い = 『スコープ』
  • グローバル変数を関数内で書き換える = 『global 変数名』

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

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

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