変数の種類とスコープ #
教科書 p.197(Lesson 7.6)関数を定義するようになると,関数の中で使う変数と,関数の外で使う変数が混在することがあります. このうち,関数内で名前が決められ,利用される変数を ローカル変数(Local Variable) と呼びます. 関数の仮引数もローカル変数です.
一方,関数の外で名前が決められ,利用される変数を グローバル変数(Global Variable) と呼びます. どちらも有効範囲があり,これを スコープ(Scope) と呼びます. ローカル変数の有効範囲は,その変数が定義された関数内部であり, グローバル変数の有効範囲は,その変数が定義されたファイル内全体です.
def add(a, b): # a, b は仮引数で,ローカル変数.
c = a + b # c はローカル変数.
return c
def subtract(a, b): # a, b は仮引数で,ローカル変数.
c = a - b # c はローカル変数だけど,addでのcとは別の変数.
return c # 関数が異なると,例え名前が同じでも,ローカル変数は全く異なる変数として扱われる.
def multiple(a, b):
d = a * b # 関数の中からは,他の関数の変数(c)にはアクセスできない.
return d # a, b はたまたま同じ名前だが,他の関数の a, b とは全く別物.
def divide(a, b):
if b == 0:
return "0で割ることはできません."
d = a // b
return d
x = 10 # これ以降の変数は関数に所属していないため,グローバル変数.
y = 5 # 関数の外なので,関数内で定義されたローカル変数(a, b, c, d)にはアクセスできない.
print(f"{x} + {y} = {add(x, y)}")
print(f"{x} - {y} = {subtract(x, y)}")
print(f"{x} * {y} = {multiple(x, y)}")
print(f"{x} // {y} = {divide(x, y)}")
このプログラムでは,add
関数,subtract
関数,multiple
関数,divide
関数の中で a
, b
という変数が使われています.
また,add
関数,subtract
関数では c
,multiple
関数,divide
関数では d
という変数が使われています.
これらの変数は,それぞれの関数内で定義されているため,ローカル変数です.
ローカル変数は関数内でしか有効ではなく,関数の外側では利用できません.
グローバル変数を利用する #
一方,x
と y
, は関数の外で定義されているため,グローバル変数です.
グローバル変数はファイル内のどこでも(関数内部でも)利用できます.
ただし,グローバル変数を関数内部で利用する時には,global
キーワードを使って宣言する必要があります.
a = 0
def func1():
a = 1 # この a はローカル変数で,グローバル変数 a とは別物.
print(f"func1: a = {a}") # 名前がグローバル変数と同じでも問題ない.
def func2():
global a # グローバル変数 a を利用することを宣言する.
a = 10 # グローバル変数 a を利用することにしたので,ローカル変数 a は利用できない.
b = 20
print(f"func2: a = {a}, b = {b}")
print(f"global a = {a}")
func1()
print(f"global a = {a} after func1")
func2()
print(f"global a = {a} after func2")
実行結果 #
$ python3 scope2.py
global a = 0
func1: a = 1
global a = 0 after func1
func2: a = 10, b = 20
global a = 10 after func2
ローカル変数一覧 #
教科書 p.203 (Lesson 7.6)dir
関数は,関数内で利用すると,その関数で定義されているローカル変数一覧を取得できます.
デバッグ時などに利用すると便利です.
def func():
a = 1
b = 2
c = 3
print(f"func: {dir()}")
func()
実行結果 #
$ python3 scope3.py
func: ['a', 'b', 'c'] # func で定義されているローカル変数の一覧
変数の寿命 #
教科書 p.204 (Lesson 7.7)変数は,メモリ上に記憶される領域が確保されて初めて利用できます. ただ,いつまでもメモリ上に記憶されているわけではなく,変数には寿命があります. 変数の寿命が過ぎると,記憶されていた領域が解放され,その変数は利用できなくなります.
ローカル変数は関数内で値が代入された時点で,メモリ上に領域が確保され,利用できるようになります. そして,関数が終了すると,その時点で確保された領域は解放され,ローカル変数は利用できなくなります.
一方,グローバル変数は,プログラムの処理が始まる前に領域が確保され,プログラムの終了時にメモリが解放されます. そのため,プログラム全体で利用できます.