PR

【Python】グローバル変数とローカル変数の違いを3分でわかりやすく解説

Python

このページでは、Pythonにおけるローカル変数とは何か?グローバル変数とは何か?両者は何が違う?という疑問について解説します。

結論から言うとローカル変数はその定義された特定のスコープ内(たとえば特定の関数内やクラスメソッド内)でのみ参照・変更が可能な変数。

対して、グローバル変数はプログラム全体、すなわち全ての関数やクラスから参照・変更が可能な変数です。

用語意味特徴
ローカル変数定義された特定のスコープ内(たとえば特定の関数内やクラスメソッド内)でのみ参照・変更が可能な変数定義したスコープ内でのみ有効
グローバル変数プログラム全体、すなわち全ての関数やクラスから参照・変更が可能な変数プログラム全体で有効
Pythonにおけるローカル変数・グローバル変数の意味

このページでは、Python初心者向けに1からローカル変数とグローバル変数の違いをサンプルコード付きで分かりやすく解説します。

参考 Pythonの特徴

このページで学べる内容
  • 【前提】Pythonの「変数」とは?
  • ローカル変数とは?
  • グローバル変数とは?
  • ローカル変数とグローバル変数

Pythonエンジニアを目指す方であれば知らないと恥ずかしい超・基本知識の1つです。是非最後までご覧ください。

参考 Pythonの基本的な書き方・構文ルール

スポンサーリンク

前提:Pythonの「変数」とは?

まずは、前提となる「変数」の基本から解説します。

「変数」なんでもう理解しているよ!という方はこの章は読み飛ばしてください。

プログラミングにおける変数(variable)とは、データを扱うメモリ領域のことを指します。

メモリ領域というと言葉が難しいですが、変数は「箱」に例えて考えるとわかりやすくなります。

図1:変数とは?

この「箱」には、数字や文字列、日付など様々な値を入れることができます。「箱」の中の値を足し算してみたり、「箱」の中の値を画面に表示させてみたり、「箱」の中の値に応じて処理を変えてみたり、様々な用途で利用します。

Pythonでは、変数と変数の初期値を=(イコール)で結び変数を宣言します。

a = 100  # 変数宣言(変数a / 初期値100)
print(a) # 画面に100が表示されます

参考 print関数

Pythonではこの変数には大きく分けて以下2つの区分が存在します。

このページでは2つの変数の違いを中心に解説していきます。

用語意味特徴
ローカル変数定義された特定のスコープ内(たとえば特定の関数内やクラスメソッド内)でのみ参照・変更が可能な変数定義したスコープ内でのみ有効
グローバル変数プログラム全体、すなわち全ての関数やクラスから参照・変更が可能な変数プログラム全体で有効
再掲:ローカル変数 vs グローバル変数

Python:ローカル変数

Pythonのローカル変数は、それが定義された特定のスコープ(通常は関数内など)でのみ存在し、その範囲でのみアクセスできる変数です。つまり、ローカル変数はその定義場所(関数など)の外からは直接参照したり操作したりすることができません。

def say_hello():
    greeting = "こんにちは、世界!"  # ローカル変数
    print(greeting)

say_hello()  # "こんにちは、世界!"と出力
print(greeting)  # エラー。greetingはsay_hello関数のスコープ外で参照不可能

参考 Pythonの関数(def文)

このコードでは、関数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のローカル変数とグローバル変数の主な違いはそのスコープ、つまりその変数が参照できる範囲です。

ローカル変数は特定の関数やメソッドの中でのみ存在し、その範囲を超えて使用することはできません。一方、グローバル変数はプログラム全体、すなわち全ての関数やクラスからアクセス可能な変数です。

用語意味特徴
ローカル変数定義された特定のスコープ内(たとえば特定の関数内やクラスメソッド内)でのみ参照・変更が可能な変数定義したスコープ内でのみ有効
グローバル変数プログラム全体、すなわち全ての関数やクラスから参照・変更が可能な変数プログラム全体で有効
再掲:ローカル変数 vs グローバル変数
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

しかし、同じ名前のローカル変数とグローバル変数が存在すると、「名前の衝突」という状況が発生します。これは、ローカル変数とグローバル変数のどちらを参照すべきかが曖昧になるためです。

Pythonの動きとしては、まずローカル変数を探しに行き、なければグローバル変数を参照するような動きをします。

別の関数であれば同じ名称のローカル変数を定義しても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:グローバル変数
  • スクリプトの最上位レベルで定義され、プログラム全体からアクセス可能。
  • グローバル変数の値は、プログラムが終了するまで保持される。
  • 関数内からグローバル変数を変更したい場合は、globalキーワードを使用して明示的に宣言する必要がある。
  • 関数内でグローバル変数と同じ名前のローカル変数を定義すると、その関数内ではローカル変数が優先され、グローバル変数は隠蔽される。

これらの特性を理解し、適切な場面で適切な変数(ローカル変数やグローバル変数)を使用することで、プログラムの構造をより明瞭にし、バグの発生を抑制することが可能となります。

始めてPythonを勉強するのは結構難しいですよね。

でもその悩みを抱えているのは一人じゃありません。全てのPython使いが同じ道を進んできました。

Pythonをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?今すぐ行動したい方は以下の記事をチェック!

読者料典 Python入門:学習カリキュラム ←こちらから!

このWebサイトは現役のエンジニアが以下3点を目的として運営しています。

  1. 勉強:一度理解した内容を忘れないように。
    → アウトプットは「最強のインプット」である! 
  2. 備忘:忘れたとしても後から見返せるように。
    → 未来の自分への「お手紙」を書いています。 
  3. 共有:〇〇ってこうだったんだ!の感動をシェアできるように。
    → あなたの知識は誰かにとっての「価値ある情報」です。 

副業ブログの始め方はこちらから

スポンサーリンク
Python
シェアする
ビズドットオンラインをフォローする
タイトルとURLをコピーしました