【おさえておきたい】Python変数の種類について【クラス変数など】

雑学

更新月:2024/12
Pythonの変数の種類・スコープについて理解する記事になります。

Pythonの変数の種類とそのスコープ

Pythonには、変数がどこで定義され、どこからアクセスできるかに基づいていくつかの異なる種類の変数があります。以下では、クラス変数インスタンス変数グローバル変数ローカル変数の違いについて説明します。

1. クラス変数 (Class Variable)

クラス変数は、クラス全体で共有される変数です。すべてのインスタンスが同じ値を参照します。

クラス定義内で、self キーワードを使わずに定義します。

class Dog:
    species = "Canis familiaris"  # クラス変数

    def __init__(self, name):
        self.name = name  # インスタンス変数

# インスタンス化
dog1 = Dog("Buddy")
dog2 = Dog("Charlie")

# クラス変数へのアクセス
print(dog1.species)  # 出力: Canis familiaris
print(dog2.species)  # 出力: Canis familiaris

特徴:

  • クラス変数は、クラスのすべてのインスタンスで共有されます。
  • クラス名を使ってアクセスすることが一般的です。
  • インスタンスを通じてもアクセス可能ですが、通常はクラス自体からアクセスします。

2. インスタンス変数 (Instance Variable)

インスタンス変数は、各インスタンスごとに固有の値を持つ変数です。

__init__ メソッド内で self キーワードを使って定義します。

class Dog:
    def __init__(self, name, age):
        self.name = name  # インスタンス変数
        self.age = age    # インスタンス変数

# インスタンス化
dog1 = Dog("Buddy", 5)
dog2 = Dog("Charlie", 3)

print(dog1.name)  # 出力: Buddy
print(dog2.name)  # 出力: Charlie

特徴:

  • インスタンス変数は各インスタンス(オブジェクト)ごとに異なる値を保持します。
  • self を使ってアクセスします。
  • インスタンスごとに値を変更でき、変更した値は他のインスタンスには影響しません。

3. グローバル変数 (Global Variable)

グローバル変数は、スクリプト全体でアクセスできる変数です。

スクリプトの最上部に定義され、関数内やクラス内からもアクセスできます(ただし、関数内で書き換えるには global キーワードが必要)。

x = 10  # グローバル変数

def func():
    print(x)  # グローバル変数を参照

func()  # 出力: 10

特徴:

  • スクリプト全体で有効な変数です。
  • 関数内でも使用できますが、関数内で変更する場合は global キーワードが必要です。
  • グローバル変数は他の関数やクラスからもアクセス可能ですが、変更しないことが望ましいとされています(変更するとコードの可読性や予測可能性が低くなるため)。

グローバル変数の変更

x = 10  # グローバル変数

def func():
    global x
    x = 20  # グローバル変数を変更

func()
print(x)  # 出力: 20

4. ローカル変数 (Local Variable)

ローカル変数は、関数内で定義された変数で、その関数内でのみ有効です。

関数が呼び出されるたびに新たに作成され、関数が終了すると自動的に削除されます。

def func():
    x = 10  # ローカル変数
    print(x)

func()  # 出力: 10
# print(x)  # エラー: 'x' is not defined

特徴:

  • ローカル変数は、その定義された関数内でのみ有効です。
  • 他の関数からアクセスすることはできません。
  • 関数呼び出しごとに新たに作成され、関数の実行が終わるとメモリから解放されます。

ローカル変数のスコープ

def func():
    x = 10  # ローカル変数
    def inner_func():
        print(x)  # outer関数のローカル変数にアクセス可能
    inner_func()

func()  # 出力: 10

関数内で定義された変数は、その関数内でのみ有効です。

ただし、ネストされた関数(内部関数)から親関数のローカル変数にアクセスできます。

各変数の特徴まとめ

変数の種類 定義場所 有効範囲 特徴
クラス変数 クラス定義内、self は使用しない クラス全体で共有 クラス全体で共通の値を保持。インスタンスを通じてもアクセス可能だが、通常はクラス名でアクセス
インスタンス変数 __init__ メソッド内、self を使用 インスタンスごとに固有 各インスタンスごとに固有の値を保持。インスタンスごとに異なるデータを管理
グローバル変数 スクリプトの最上部 スクリプト全体で有効 スクリプト全体で共有され、関数内でもアクセス可能。ただし変更するには global が必要
ローカル変数 関数内 定義された関数内のみ有効 関数内でのみ使用可能で、関数の終了とともに消える。外部からアクセスできない

まとめ

  • インスタンス変数: 各オブジェクトに固有のデータを保持。
  • クラス変数: クラス全体で共有されるデータを保持。
  • グローバル変数: スクリプト全体で有効で、どこからでもアクセス可能。ただし、変更にはglobalが必要。
  • ローカル変数: 関数内でのみ有効な変数で、その関数のスコープ内でのみ使用される。

関連記事

外部リンク

生成AIメモ

  • 利用AI:ChatGPT 4o mini、一部利用
  • プロンプト1:クラス変数、インスタンス変数、グローバル変数、ローカル変数の違いについて説明をお願いします。
  • プロンプト2:先程の内容をhtml形式(style使わず)で示してください

内容チェック済。