Pythonでプログラムを組んでいる時に若干詰まったところなのでメモ代わりに書いておきます。
変数 flg = 1 の時、数字が0,1,2,3,4と順番に出力され、flg = 0 の時は4,3,2,1,0と出力されるプログラムを組もうと考えました。
そこで以下のようなコードを書いてみました。
まず関数 main() にて数字を0から4まで順番に出力した後、関数 flag() 内にて変数 flg の値を0に書き換え、再び関数 main() を走らせることで、
0,1,2,3,4,4,3,2,1,0・・・
と表示されるはずです。
このコードの実行結果は以下のようになりました。
最初の 0~4 までは正常に出力できていますが、その先が再び同じ順番で数字が出力されてしまっています。
この問題を理解するのに少し時間がかかってしまいましたが、何とか自分で調べて解決することができました。
関数内で宣言した変数はローカル変数であり、関数外で宣言したグローバル変数とは別のものである
先程のコードでうまくいかなかった原因としては、関数 flag() 内において、
flg = 0
と宣言してしまっている事が原因でした。
こう書くことで、1行目で宣言した flg という変数の中身を書き換えられると思ったのですが、関数内で変数を宣言した場合、その関数内のみでアクセスできる『ローカル変数』が宣言されてしまうとのこと。
1行目で宣言している変数 flg というのは、関数の外で宣言しているため、グローバル変数と呼ばれるものになります。
関数の中と外の違いが分からないという方は以下の視覚的に表した画像でも見てみてください。
黄色い枠の部分で変数を宣言すると、その変数はグローバル変数扱いとなり、どの関数内からでもアクセスできます。
赤い枠部分で宣言された変数はローカル変数扱いとなり、その関数内でしかアクセスすることができません。
Pythonで関数内からグローバル変数にアクセスするには、以下のように書き直します。
関数内で flg = 0 と書く前に、
global flg
といったように、変数の前に『global』と付けたコードを記述しておきます。
これによって、この関数内では1行目で宣言されたグローバル変数 flg にアクセスします!とプログラムに理解させることができます。
それから flg = 0 と記述することで、1行目で宣言したグローバル変数の中身が書き換わります。
この状態で実行すると以下のようになります。
しっかりと 0,1,2,3,4,4,3,2,1,0 と順番に表示されました。
・・・ていうか、わざわざ関数 flag() なんて定義せず、普通に関数の外でflg = 0と書き換えれば済むことなんですけどね(笑)
今回は以上です。
P.S. 関数内からグローバル変数にアクセスする際の注意点
以下の画像のように、1行でグローバル変数へのアクセスと値の書き換えを行うことはできません。
普通にできるだろうと思って書いてしまったのですが、普通にエラーを吐いてしまうので気を付けましょう(笑)
コメント