どうも!リョクちゃです。
前回は、Pythonにおける値渡しと参照渡しについて紹介しました。
今回は、変数の有効な範囲について中心に、
ローカル変数やグローバル変数などを紹介をしていきます。
ちなみに前回はこちら
目次
ローカル変数
関数内で定義されている変数をローカル変数といいます。
たとえば、以下にコードを示します。
1 2 3 4 5 6 |
def target(): message = "Python" print(message) target() |
作成されたtarget関数内にある”message”変数がローカル変数と呼ばれます。
グローバル変数
関数外で定義されている変数をグローバル変数といいます。
たとえば、以下にコードを示します。
1 2 3 4 5 6 7 8 |
message = "Python" def target(): print(message) target() |
作成されたtarget関数外で定義された”message”変数がグローバル変数と呼ばれます。
target関数を呼び出した際に、
自身は外にあるmessage変数をprint関数で出力しています。
ローカル変数とグローバル変数
たとえば、このような場合はどうでしょうか。
以下にコードを示します。
1 2 3 4 5 6 7 |
def target(): message = "Python" print(message) target() print(message) |
target関数外にあるprint関数でmessage変数を出力しようとしています。
これを実行すると、例外エラーが発生してしまいます。
“name ‘message’ is not defined” messageは定義されていません。
このように、message変数は関数内でしか有効ではないことがわかります。
一方で、このような場合はどうなるでしょうか?
以下にコードを示します。
1 2 3 4 5 6 7 8 9 10 11 |
message = "Python" print(message) def target(): message = "Python man" print(message) target() print(message) |
これを実行すると、出力は以下のようになります。
- Python
- Python man
- Python
関数外で出力されるのはそれぞれ”Python”になり、
関数内で出力されるのは”Python man”になります。
それでは、定義されているmessage変数が関数の外と内で異なる変数なのでしょうか?
前回紹介したid関数を使って確認してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
message = "Python" def target(): message = "Python man" print("関数内 message変数 : " + str(id(message))) target() print("関数外 message変数 : " + str(id(message))) # 出力 # 関数内 message変数 : 2508214814256 # 関数外 message変数 : 2508164074944 |
関数外と内では異なる変数であることがわかりました。
Pythonでは、このように関数の内部と外部では、ローカル変数は分離されています。
同じ名前の変数であっても独立しているため、それぞれ異なる変数として扱われます。
ローカル変数をグローバル変数として扱う?
それでは、関数内で変数messageを関数外と同じように扱いたい場合どうなるでしょうか?
以下にコードを示します。
1 2 3 4 5 6 7 8 9 10 11 12 |
message = "Python" print(message) def target(): global message message = "Python man" print(message) target() print(message) |
ここでは、関数内でglobal messageと記述することで、
変数messageはグローバル変数のmessageと同じですよ。と定義しています。
実際にid関数を使って確認してみましょう。
以下にコードを示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
message = "Python" print("関数外 message変数 : " + str(id(message))) print(message) def target(): global message print("関数内 message変数 : " + str(id(message))) message = "Python man" print(message) target() print("関数外 message変数 : " + str(id(message))) print(message) # 出力 # 関数外 message変数 : 2924435639744 # Python # 関数内 message変数 : 2924435639744 # Python man # 関数外 message変数 : 2924486571568 # Python man |
message変数に新たに値が代入されるまでは同一のidであることがわかります。
したがって、global messageと記述することで、
関数内のmessage変数もグローバル変数として扱うことができるようになります。
まとめ
グローバル変数は、変数の有効な範囲に制限がなく、
関数定義を超えて利用が可能です。
そのため、どこで値が代入されたのがわかりにくくなってしまいます。
※ 使う場所によってはあまり推奨はされていません。
関数内で同一名の変数をグローバル変数として統一したい場合は、
global <変数名>と記述することで可能。
・こちらの書籍を参考にPythonの理解を深めました。