Pythonのグローバル変数とローカル変数の使い方

2021/01/14PythonPythonの基本

Pythonの変数にはグローバル変数とローカル変数という2つのスコープが異なる変数を持つことができます。

グローバル変数は関数の外に宣言された変数でファイル内の位置からも参照可能になります。

それに対してローカル変数は関数内だけで有効な変数になります。

スポンサーリンク

Pythonのグローバル変数

Pythonのグローバル変数は関数の外で定義され、ファイル内のどの位置からも参照が可能です。

g = 123    #グローバル変数

def func1() :
    print( "g={}".format( g ))

func1()
print( "g={}".format( g ))

上記のコードを実行すると

g=123
g=123

と関数内でも関数外からでも参照できます。

グローバル変数を関数内で変更する場合はglobalキーワードで宣言

グローバル変数で気をつけなければならないのは、関数内でグローバル変数の値を変更する場合は「global」キーワードをつけて関数内で再宣言します。

先ずは「global」キーワードがない場合

g = 123    #グローバル変数

def func1() :
   g = 456
   print( "g={}".format( g ))

func1()
print( "g={}".format( g ))

上記のコードを実行すると

g=456
g=123

と関数内ではグローバル変数の「g」の値が「456」に変わっているように見えますが、関数終了後の「g」は「123」のままです。

これはグローバルの「g」と関数内のローカル変数「g」がメモリ上は別のエリアに取られていることが原因です。

また、

g = 123    #グローバル変数

def func1() :
   print( "g={}".format( g ))
   g = 456

func1()
print( "g={}".format( g ))

「g」の値を変える場所を変えると

Traceback (most recent call last):
  File "main.py", line 7, in <module>
    func1()
  File "main.py", line 4, in func1
    print( "g={}".format( g ))
UnboundLocalError: local variable 'g' referenced before assignment

とエラーになり、うまく行きません。

関数内でグローバル変数を操作するには関数内で「global」キーワードをつけて宣言しなおします。

g = 123    #グローバル変数

def func1() :
   global g   #グローバル変数を使うことを再宣言

   g=456
   print( "g={}".format( g ))
   g=789

print( "g={}".format( g ))
func1()
print( "g={}".format( g ))

上記のコードを実行すると

g=123
g=456
g=789

と意図した値に「g」の値が変わっています。

Pythonのローカル変数

Pythonのローカル変数は関数内だけで有効な変数で、関数の外から参照したり更新したりはできません。

def func1() :
   l = "ABC"
   print( "l={}".format( l ))

func1()

上記のコードを実行すると

l=ABC

とローカル変数を参照できます。

次のコードのように関数外でローカル変数にアクセスしようとしても

def func1() :
   l = "ABC"
   print( "l={}".format( l ))

func1()
print( "l={}".format( l ))    #関数外でアクセスしてみる
l=ABC
Traceback (most recent call last):
  File "main.py", line 6, in <module>
    print( "l={}".format( l ))    #関数外でアクセスしてみる
NameError: name 'l' is not defined

とエラーになってしまいます。

まとめ

Pythonのグローバル変数とローカル変数は他の言語と同じようにそれぞれスコープを持っています。

特殊なのは関数内でグローバル変数を更新する場合は「global」キーワードで再宣言しなければなりません。

スポンサーリンク
株式会社システムトラスト

システムトラストでは、システムエンジニア、プログラマーなどを随時募集中です。気軽にご相談ください。

お問合せ