関数で変数を使用するときに、注意が必要です。
その注意点について学んでいきます。
情報活用編プラス
第3章「コンピュータとプログラミング」
IP02-07
関数を使ってみよう
関数で変数を使用するときに、注意が必要です。
その注意点について学んでいきます。
スライドの学習内容
Pythonでプログラムを確認しながら、スコープについて学んでいきましょう。
プログラムで変数はどこでも作れますが、その変数が使用できる範囲が決まっています。
その範囲をスコープと言います。
以下のプログラムを実行して、スコープについて確認してみましょう。
def function1():
x = 10 # 10を代入
print("関数function1の変数x:",x)
x = 20 # 20を代入
function1()
print("変数x:",x)
実行結果
関数function1の変数x: 10
変数x: 20
これは1〜3行目が関数の定義だから、プログラムは5行目から始まりますね。
5行目で変数xに20を代入してるね。
その後、関数function1の中で、xに20を代入しているね。
その直後に、xの内容を表示している。
でも、その後、関数を抜けてから表示されるxの値が変わっているよ。
なんでだ!?
よく気づきましたね。実は、このプログラムには変数xは二つあるんです。
ローカル変数と、グローバル変数の違いです。
ローカル変数とグローバル変数?
いったいなんなんだろう?
ローカル変数とは、関数の中で作られた変数のことで、関数の外や、他の関数の中で使用することができません。
基本的に、関数の中で使用している変数は、ローカル変数となります。
グローバル変数とは、関数の外で定義される変数のことを言います。
グローバル変数は、関数の外でも、関数の中でも使用することができますが、関数の中で使用するにはその宣言をしなくてはなりません。
例えば、上記のプログラムの中で作られる変数は、以下の図のようなイメージです。
関数を習う前に使っていた関数は、全部グローバル変数だったんだね。
関数の中で使っていた変数xはローカル変数の方で、関数の外はグローバル変数ってことだね。
それで表示が異なっていたんだ。
でもさ、ローカル変数って不便じゃない?
その関数の中でしか使えないんだよね。
いいところに気づきましたね。
もし、関数で作成した変数が他の関数でも使えるようになったとき、変数の値がおかしい時に、どの関数が原因かがわかりにくくなるんです。
確かに。せっかく部品として関数を作ったのに、他の関数と同じデータを扱っていたら利点が減るかもしれませんね。
そういうものなのか。
でも、グローバル変数は関数の中で使えるって言いましたけど、どうやって使うんですか?
それは、「global」キーワードを使います。
以下のプログラムを実行してみましょう。
def function2():
global x
x = 10 # 10を代入
print("関数function2の変数x:",x)
x = 20 # 20を代入
function2()
print("変数x:",x)
実行結果
関数function2の変数x:10
変数x:10
あ、どっちも10になった。
これは、2行目で global x と書くことで、「この関数で使う変数xは、グローバル変数の方だよ」と指定ができるんです。
変数を使うときは、スコープに注意して下さいね。