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_momo
、total_mikan
, total
)は、すべてローカル変数です。また、関数の引数(number_of_momo
と number_of_mikan
) もローカル変数になります。
ローカル変数は、関数を実行しているあいだのみ、参照できます。fruit_price()
の total_momo
などの変数は、関数外からは参照できません。
グローバル変数¶
もう一つの変数は、グローバル変数 です。ローカル変数以外の、関数の外部で代入された変数は、すべてグローバル変数になります。
関数の定義 では、こんなプログラムを書きました。
momo = input("ももは何個買いますか?") # ももの個数を入力する
num_momo = int(momo) # 入力した文字列を、整数値に変換する
ここで、変数 momo
や num_momo
は、関数の内部ではなく、関数の外部で代入されていますので、すべてグローバル変数になります。
関数とグローバル変数¶
ローカル変数は関数の内部でしか参照できませんが、グローバル変数は、どんな場合でも参照できます。
次の関数 test_global()
は、関数の内部でグローバル変数 global_value
を参照し、関数の引数で指定した値 arg
と global_value
との積を返します。
# global_value はグローバル変数
global_value = 100
def test_global(arg):
# ローカル変数 arg と グローバル変数 global_value の積
return arg * global_value
print(test_global(10)) # 10 * 100
関数 test_global()
に引数を指定して呼び出すと、関数内で引数 arg
とグローバル変数 global_value
の掛け算を行います。
test_global(10)
と、引数 に 10
を指定して呼び出すと、arg
の値は 10
、global_value
の値は 100
に設定されていますから、結果は 10 * 100
で 1000
になります。
test_global(10)
の戻り値は、グローバル変数 global_value
の値を変えると変化します。
試しに、global_value
の値を、100
から 200
に変更してから、もう一度 test_global(10)
を実行してみましょう。
# global_value を 200 に変更
global_value = 200
print(test_global(10)) # 10 * 200
引数 arg
の値は前回と同じ 10
ですが、グローバル変数 global_value
の値が 200
になりましたから、結果は 10 * 200
で 2000
に変化しています。
モジュールスコープとローカルスコープ¶
Pythonプログラムのうち、関数以外の部分は、モジュールスコープ(Module scope) と言います。逆に、関数内の部分を、ローカルスコープ(Local scope) と言います。
モジュールスコープで代入された変数は グローバル変数 となリ、ローカルスコープで代入された変数は ローカル変数 になります。
前述のとおり、同じモジュールスコープで定義されたグローバル変数は、関数の内側でも参照できます。また、関数の内側では、グローバル変数だけではなく、同じモジュールスコープで定義した別の関数も呼び出せます。
次の例では、関数 func2()
は、先に定義された関数 func1()
を呼び出しています。
def func1(name):
print("Hello", name, ", this is func1.")
def func2():
func1("func2")
func2()
この例では、関数 func1()
と func2()
は、どちらも同じモジュールスコープで定義されていますから、func2()
から func1()
を呼び出せるのです。
同様に、モジュールスコープで import したモジュールも、そのスコープで定義された関数から参照できます。
次の例は、モジュールスコープで import
した time
モジュールを関数 print_time()
内で参照し、time.asctime()
関数を呼び出して現在の日付と時間を取得しています。
import time
def print_time():
# モジュールスコープで import した timeモジュールを利用
now = time.asctime()
print("It is", now)
print_time()