変数の有効範囲

変数はいろんな箇所に宣言できますが、どこに宣言するかで扱いが異なってきます。
基本的に関数の内部で宣言した変数は、ローカル変数と言います。
関数の外部(外側)で宣言した変数は、グローバル変数と言います。

以下のサンプルで確認しましょう。


def func1(number):
    print("ローカル変数number:", number)  ・・・(a)
    print("関数の中でのggg:", ggg)     ・・・(b)

ggg = "12345"               ・・・①
func1(100)                 ・・・②
print("関数の外でのggg:", ggg)       ・・・③
print("関数の外でのnumber", number)    ・・・④

これを実行すると、以下のように表示されます。

---------------------------------------------------------------------
ローカル変数number: 100

関数の中でのggg: 12345

関数の外でのggg: 12345

Traceback (most recent call last):

  File "C:\Users\taka\Desktop\python\sample10.py", line 8, in <module>

    print("関数の外でのnumber", number)

NameError: name 'number' is not defined
---------------------------------------------------------------------

解説します。

まず、defでfunc1という関数を定義しています。
このfunc1関数内で、ローカル変数であるnumberを表示されています。
続いてグローバル変数であるgggを表示させています。

次に関数の外部(外側)です。
①でグローバル変数gggに、12345 を代入しています。
②でfunc1関数に引数100を渡しています。
 ⇒100が渡ってきたので、(a)で100が表示され、(b)で12345が表示されます。
③ではグローバル変数を表示させているので、12345が表示されます。
最後の④は、関数内部で宣言したnumberを表示させようとしているため、
有効範囲ではない、ということでエラーになります。


次に、関数の中でグローバル変数に値を代入したい場合の例を説明します。

関数の中で値を代入すると、その代入された変数はローカル変数の扱いになります。
明示的にグローバル変数であることを表すなら、global と付けます。

def 関数名():
    global 変数名1, 変数名2 ...


以下のサンプルで確認しましょう。

def func2(number):
    global ggg                            ・・・③
    ggg = "ABCDE"             ・・・④
    print("ローカル変数number:", number)
    print("関数の中でのggg:", ggg)        ・・・⑤

ggg = "12345"               ・・・①
func1(100)                ・・・②
print("関数の外でのggg:", ggg)      ・・・⑥

これを実行すると、以下のように表示されます。

---------------------------------------------------------------------
ローカル変数number: 100

関数の中でのggg: ABCDE

関数の外でのggg: ABCDE
---------------------------------------------------------------------

実行の順序で解説します。
①でグローバル変数が宣言されて、そこに、12345が代入されます。
②でfunc2関数を呼び出します。
③でグローバル変数を関数の中で定義しています。
④で、そのグローバル変数に、ABCDEが代入されます。
⑤で、そのグローバル変数を表示させています。 ABCDE と表示されます。
⑥でも、グローバル変数gggを表示させていますが、④でgggがABCDEに置き換わっているため、ここでもABCDEと表示されるわけです。