ゼロからのPython入門講座関数の定義 ローカル変数とグローバル変数

関数の定義ローカル変数とグローバル変数関数の呼び出し方

Pythonの 変数 には、2つの種類があります。

一つは ローカル変数 、もう一つは グローバル変数 です。

ローカル変数

関数の中で代入した変数は、すべて ローカル変数 となります。関数の定義 では、こんな関数を定義しました。

def fruit_price(number_of_momo, number_of_mikan):
    total_momo = number_of_momo * 200
    total_mikan = number_of_mikan * 40
    total = total_momo + total_mikan

    return total

この関数 fruit_price() の中で代入された変数(total_momototal_mikan, total)は、すべてローカル変数です。また、関数の引数(number_of_momonumber_of_mikan) もローカル変数になります。

ローカル変数は、関数を実行しているあいだのみ、参照できます。fruit_price()total_momo などの変数は、関数外からは参照できません。

グローバル変数

もう一つの変数は、グローバル変数 です。ローカル変数以外の、関数の外部で代入された変数は、すべてグローバル変数になります。

関数の定義 では、こんなプログラムを書きました。

momo = input("ももは何個買いますか?")  # ももの個数を入力する
num_momo = int(momo) # 入力した文字列を、整数値に変換する

ここで、変数 momonum_momo は、関数の内部ではなく、関数の外部で代入されていますので、すべてグローバル変数になります。

関数とグローバル変数

ローカル変数は関数の内部でしか参照できませんが、グローバル変数は、どんな場合でも参照できます。

次の関数 test_global() は、関数の内部でグローバル変数 global_value を参照し、関数の引数で指定した値 argglobal_value との積を返します。

In [27]:
# global_value はグローバル変数
global_value = 100

def test_global(arg):
    # ローカル変数 arg と グローバル変数 global_value の積
    return arg * global_value

print(test_global(10)) # 10 * 100
1000

関数 test_global() に引数を指定して呼び出すと、関数内で引数 arg とグローバル変数 global_value の掛け算を行います。

test_global(10) と、引数 に 10 を指定して呼び出すと、arg の値は 10global_value の値は 100 に設定されていますから、結果は 10 * 1001000 になります。

test_global(10) の戻り値は、グローバル変数 global_value の値を変えると変化します。

試しに、global_value の値を、100 から 200 に変更してから、もう一度 test_global(10) を実行してみましょう。

In [28]:
# global_value を 200 に変更
global_value = 200

print(test_global(10)) # 10 * 200
2000

引数 arg の値は前回と同じ 10 ですが、グローバル変数 global_value の値が 200 になりましたから、結果は 10 * 2002000 に変化しています。

モジュールスコープとローカルスコープ

Pythonプログラムのうち、関数以外の部分は、モジュールスコープ(Module scope) と言います。逆に、関数内の部分を、ローカルスコープ(Local scope) と言います。

モジュールスコープで代入された変数は グローバル変数 となリ、ローカルスコープで代入された変数は ローカル変数 になります。

前述のとおり、同じモジュールスコープで定義されたグローバル変数は、関数の内側でも参照できます。また、関数の内側では、グローバル変数だけではなく、同じモジュールスコープで定義した別の関数も呼び出せます。

次の例では、関数 func2() は、先に定義された関数 func1() を呼び出しています。

In [29]:
def func1(name):
    print("Hello", name, ", this is func1.")

def func2():
    func1("func2")

func2()
Hello func2 , this is func1.

この例では、関数 func1()func2() は、どちらも同じモジュールスコープで定義されていますから、func2() から func1() を呼び出せるのです。

同様に、モジュールスコープで import したモジュールも、そのスコープで定義された関数から参照できます。

次の例は、モジュールスコープで import した time モジュールを関数 print_time() 内で参照し、time.asctime() 関数を呼び出して現在の日付と時間を取得しています。

In [30]:
import time

def print_time():
    # モジュールスコープで import した timeモジュールを利用
    now = time.asctime()
    print("It is", now)
    
print_time()
It is Sat Sep 19 18:21:44 2020
Copyright © 2001-2023 python.jp Privacy Policy python_japan
Amazon.co.jpアソシエイト
Amazonで他のPython書籍を検索