このページでは、Pythonにおけるローカル変数とは何か?グローバル変数とは何か?両者は何が違う?という疑問について解説します。
結論から言うとローカル変数はその定義された特定のスコープ内(たとえば特定の関数内やクラスメソッド内)でのみ参照・変更が可能な変数。
対して、グローバル変数はプログラム全体、すなわち全ての関数やクラスから参照・変更が可能な変数です。
用語 | 意味 | 特徴 |
---|---|---|
ローカル変数 | 定義された特定のスコープ内(たとえば特定の関数内やクラスメソッド内)でのみ参照・変更が可能な変数 | 定義したスコープ内でのみ有効 |
グローバル変数 | プログラム全体、すなわち全ての関数やクラスから参照・変更が可能な変数 | プログラム全体で有効 |
このページでは、Python初心者向けに1からローカル変数とグローバル変数の違いをサンプルコード付きで分かりやすく解説します。
参考 Pythonの特徴
Pythonエンジニアを目指す方であれば知らないと恥ずかしい超・基本知識の1つです。是非最後までご覧ください。
前提:Pythonの「変数」とは?
まずは、前提となる「変数」の基本から解説します。
プログラミングにおける変数(variable)とは、データを扱うメモリ領域のことを指します。
メモリ領域というと言葉が難しいですが、変数は「箱」に例えて考えるとわかりやすくなります。
この「箱」には、数字や文字列、日付など様々な値を入れることができます。「箱」の中の値を足し算してみたり、「箱」の中の値を画面に表示させてみたり、「箱」の中の値に応じて処理を変えてみたり、様々な用途で利用します。
Pythonでは、変数と変数の初期値を=(イコール)で結び変数を宣言します。
a = 100 # 変数宣言(変数a / 初期値100) print(a) # 画面に100が表示されます
参考 print関数
以下のページでは、Pythonにおける変数の使い方を1分で理解できるよう図解して解説しています。
この機会に合わせて学習したいという方は是非1度ご覧になってください。
Pythonではこの変数には大きく分けて以下2つの区分が存在します。
このページでは2つの変数の違いを中心に解説していきます。
用語 | 意味 | 特徴 |
---|---|---|
ローカル変数 | 定義された特定のスコープ内(たとえば特定の関数内やクラスメソッド内)でのみ参照・変更が可能な変数 | 定義したスコープ内でのみ有効 |
グローバル変数 | プログラム全体、すなわち全ての関数やクラスから参照・変更が可能な変数 | プログラム全体で有効 |
Python:ローカル変数
Pythonのローカル変数は、それが定義された特定のスコープ(通常は関数内など)でのみ存在し、その範囲でのみアクセスできる変数です。つまり、ローカル変数はその定義場所(関数など)の外からは直接参照したり操作したりすることができません。
def say_hello(): greeting = "こんにちは、世界!" # ローカル変数 print(greeting) say_hello() # "こんにちは、世界!"と出力 print(greeting) # エラー。greetingはsay_hello関数のスコープ外で参照不可能
このコードでは、関数say_hello
内にローカル変数greeting
を定義しています。
この変数は、say_hello
関数内からのみアクセス可能であり、関数の外部からは参照できません。そのため、関数の外部でprint(greeting)
を試みると、Pythonはgreeting
が定義されていないというエラーを返します。
ローカル変数の最も重要な特性は、それが定義されたスコープ内でのみ生存することです。このスコープは通常、変数が定義されている関数またはメソッドであり、この範囲を超えてローカル変数にアクセスすることはできません。この特性により、ローカル変数はそのスコープ内でのみ値が保持され、スコープが終了するとその値は破棄されます。
Python:グローバル変数
グローバル変数とは、Pythonプログラム全体、つまり全ての関数やクラスからアクセス可能な変数です。これらの変数は、通常、スクリプトの最上位レベルで定義されます。
message = "こんにちは、世界!" # グローバル変数 def print_message(): print(message) # グローバル変数messageを利用 print_message() # "こんにちは、世界!"と出力 print(message) # "こんにちは、世界!"と出力
このコードでは、最初にmessage
というグローバル変数を定義し、その後でprint_message
という関数の中でこのグローバル変数を利用しています。さらに、関数の外からも同じ変数を参照することができます。
Python:グローバル宣言(globalキーワード)
Pythonのglobal
キーワードは、グローバル変数を関数内で変更するために使用されます。
通常、関数内で変数に値を代入すると、その変数はその関数のローカル変数となります。しかし、global
キーワードを使ってその変数を宣言すると、その変数はグローバル変数として扱われ、関数内でその値を変更することができます。
x = 10 # グローバル変数 def update_x(): global x # xをグローバル変数として宣言 x = 20 # グローバル変数の値を変更 print(x) # ここでの出力は 10 update_x() # 関数を呼び出してグローバル変数xを更新 print(x) # ここでの出力は 20
このコードでは、update_x
という関数内でglobal
キーワードを使用してx
というグローバル変数を宣言し、その値を20に変更しています。その結果、関数の外からx
の値を出力すると、その値は20になっています。
なお、クラスのメソッド内でもglobal
キーワードを使用することができます。以下に具体的な例を示します。
x = 10 # グローバル変数 class Test: def update_x(self): global x # xをグローバル変数として宣言 x = 20 # グローバル変数の値を変更 print(x) # ここでの出力は 10 t = Test() t.update_x() # メソッドを呼び出してグローバル変数xを更新 print(x) # ここでの出力は 20
参考 Python:クラス
このコードでも、Test
クラスのupdate_x
メソッド内でglobal
キーワードを使用してx
というグローバル変数を宣言し、その値を20に変更しています。その結果、メソッドの外からx
の値を出力すると、その値は20になっています。
以上がglobal
キーワードの基本的な使い方です。global
キーワードは、グローバル変数の値を関数やメソッド内で変更する必要がある場合に便利ですが、グローバル変数を頻繁に変更するとプログラムの流れが予測しづらくなるため、適切に利用することが重要です。
Python:グローバル変数とローカル変数の違い
Pythonのローカル変数とグローバル変数の主な違いはそのスコープ、つまりその変数が参照できる範囲です。
ローカル変数は特定の関数やメソッドの中でのみ存在し、その範囲を超えて使用することはできません。一方、グローバル変数はプログラム全体、すなわち全ての関数やクラスからアクセス可能な変数です。
用語 | 意味 | 特徴 |
---|---|---|
ローカル変数 | 定義された特定のスコープ内(たとえば特定の関数内やクラスメソッド内)でのみ参照・変更が可能な変数 | 定義したスコープ内でのみ有効 |
グローバル変数 | プログラム全体、すなわち全ての関数やクラスから参照・変更が可能な変数 | プログラム全体で有効 |
message = "こんにちは、世界!" # グローバル変数 def print_local_message(): local_message = "こんにちは、Python!" # ローカル変数 print(local_message) def print_global_message(): print(message) # グローバル変数を利用 print_local_message() # "こんにちは、Python!"と出力 print_global_message() # "こんにちは、世界!"と出力 print(local_message) # エラー。local_messageはprint_local_message関数のスコープ外で参照不可能
ローカル変数は、その変数が定義されている特定のスコープ、つまり関数やメソッドの中でのみ存在します。したがって、関数の中で値が割り当てられた変数は、その関数の実行が終了するとその値が破棄されます。また、ローカル変数はその関数の外部からはアクセスすることができません。
一方、グローバル変数はプログラム全体からアクセス可能です。これは、グローバル変数がスクリプトの最上位レベル、すなわち全ての関数やクラスの外部で定義されるためです。そのため、関数の中からでもグローバル変数の値を読み取ったり変更したりすることができます。
注意点:変数の「名前の衝突」
Pythonではローカル変数とグローバル変数は同じ名前にすることができます。
a = 1 # グローバル変数 def sample(): a = 1000 # ローカル変数 print(a) sample() print(a) # 1000 # 1
しかし、同じ名前のローカル変数とグローバル変数が存在すると、「名前の衝突」という状況が発生します。これは、ローカル変数とグローバル変数のどちらを参照すべきかが曖昧になるためです。
別の関数であれば同じ名称のローカル変数を定義してもOK。
a = 1 # グローバル変数 def sample1(): a = 1000 # ローカル変数 print(a) def sample2(): a = "Hello Python" # ローカル変数 print(a) sample1() sample2() print(a) # 1000 # Hello Python # 1
要は、変数スコープが重複しなければ変数名称は被ってもOKということ。ただし、あえて同じ名前にする必要がなければできるだけ避けたほうが良いかと思います。
変数スコープが重複している場面で、同じ変数名を利用すると上書きされてしまうためそこは注意が必要です。
def sample(): a = 1000 # ローカル変数 a = "Hello Python!" # ローカル変数 print(a) sample() # Hello Python!
Python:ローカル変数とグローバル変数のまとめ
始めてPythonを勉強するのは結構難しいですよね。
でもその悩みを抱えているのは一人じゃありません。全てのPython使いが同じ道を進んできました。
Pythonをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?今すぐ行動したい方は以下の記事をチェック!
読者料典 Python入門:学習カリキュラム ←こちらから!
「変数」なんでもう理解しているよ!という方はこの章は読み飛ばしてください。