変数には、「スコープ」と呼ばれる、変数の有効範囲の概念があります。
関数の中で定義された変数のことを「ローカル変数」と呼び、関数の外で定義された変数を「グローバル変数」と呼びます。
ローカル変数は同じ関数の中でのみ参照できる変数で、グローバル変数はどこからでも参照できる変数になります。
イメージ的には、グローバル変数は世間の常識みたいなもので、ローカル変数は仲間内だけで通用するもの、みたいな感じでしょうか??
たとえば、グローバル変数的なものとして、「キムタク=木村拓哉」というものがあったとして、学校の同じクラスの木村琢磨くんを「キムタク」というニックネームで呼んでいる、という感じ。
同じクラスの中だけだったら、「キムタク=木村琢磨くん」で通用しますが、学校の外では、「キムタク=木村拓哉」という感じになるイメージかなぁ、と思います。
ローカル変数
次の例は、「悟空」がグローバル変数「ピッコロ」がローカル変数として書いた文です。
関数dragonballを実行すると「悟空 ピッコロ」と、グローバル変数、ローカル変数の両方ともがprintされます。
一方、次の例では、関数dragonballにローカル変数の「ピッコロ」しか入れていません。
で、グローバル変数とローカル変数をprintしようとすると、ローカル変数であるb(ピッコロ)はis not defined(定義されてない)とエラーになってしまいます。
グローバル変数を変更
なお、関数の中でグローバル変数に値を代入しようとすると、新しいローカル変数とみなされて動作します。
そのため、以下の例では、関数dragonball2でグローバル変数 a に値(悟飯)を代入しても、グローバル変数 a (悟空)の値は変わりません。
グローバル変数の値を変更するためには、グローバル変数を変更するよ、というのを明確に意思表示しなければならないです。
以下のように「global a」として、aはグローバル変数で、それに値を代入するよ、という表現が必要です。
自分がいまいじっているのが、グローバル変数なのか、ローカル変数なのか、変数のスコープを意識してプログラミングしないと、意図しない動きをする恐れがあるので、注意が必要ですね。。。