【Python勉強会】変数の有効な範囲

どうも!リョクちゃです。

前回は、Pythonにおける値渡しと参照渡しについて紹介しました。

今回は、変数の有効な範囲について中心に、
ローカル変数やグローバル変数などを紹介をしていきます。

ちなみに前回はこちら

Pythonにおける値渡しと参照渡しについて基本となる考え方を紹介しています。これを覚えることで、Pythonにおけるデータの在り方をつかんでもらいたいです。



ローカル変数

関数内で定義されている変数ローカル変数といいます。

たとえば、以下にコードを示します。

作成されたtarget関数内にある”message”変数がローカル変数と呼ばれます。

グローバル変数

関数外で定義されている変数グローバル変数といいます。

たとえば、以下にコードを示します。

作成されたtarget関数外で定義された”message”変数がグローバル変数と呼ばれます。

target関数を呼び出した際に、

自身は外にあるmessage変数をprint関数で出力しています。



ローカル変数とグローバル変数

たとえば、このような場合はどうでしょうか。

以下にコードを示します。

target関数外にあるprint関数でmessage変数を出力しようとしています。

これを実行すると、例外エラーが発生してしまいます。

“name ‘message’ is not defined” messageは定義されていません。

このように、message変数は関数内でしか有効ではないことがわかります。

一方で、このような場合はどうなるでしょうか?

以下にコードを示します。

これを実行すると、出力は以下のようになります。

  • Python
  • Python man
  • Python

関数外で出力されるのはそれぞれ”Python”になり、

関数内で出力されるのは”Python man”になります。

それでは、定義されているmessage変数が関数の外と内で異なる変数なのでしょうか?

前回紹介したid関数を使って確認してみましょう。

関数外と内では異なる変数であることがわかりました。

Pythonでは、このように関数の内部と外部では、ローカル変数は分離されています。

同じ名前の変数であっても独立しているため、それぞれ異なる変数として扱われます。


ローカル変数をグローバル変数として扱う?

それでは、関数内で変数messageを関数外と同じように扱いたい場合どうなるでしょうか?

以下にコードを示します。

ここでは、関数内でglobal messageと記述することで、
変数messageはグローバル変数のmessageと同じですよ。と定義しています。

実際にid関数を使って確認してみましょう。

以下にコードを示します。

message変数に新たに値が代入されるまでは同一のidであることがわかります。

したがって、global messageと記述することで、
関数内のmessage変数もグローバル変数として扱うことができるようになります。

まとめ

グローバル変数は、変数の有効な範囲に制限がなく

関数定義を超えて利用が可能です。

そのため、どこで値が代入されたのがわかりにくくなってしまいます。
※ 使う場所によってはあまり推奨はされていません。

関数内で同一名の変数をグローバル変数として統一したい場合は、

global <変数名>と記述することで可能。

・こちらの書籍を参考にPythonの理解を深めました。

スポンサーリンク




スポンサーリンク
スポンサーリンク