【Python】関数と変数のスコープ(ローカル変数, グローバル変数)

【Python】関数と変数のスコープ(ローカル変数, グローバル変数)

変数とは

変数とは、データを格納するための名前付きの記憶領域のことを指す。Pythonでは、変数に値を代入することで自動的に型が決まる。


x = 10  # 整数型の変数
name = "Python"  # 文字列型の変数

変数は特定のスコープ内でのみ有効であり、そのスコープの外ではアクセスできない場合がある。

スコープとは

スコープとは、変数が有効な範囲のことを指す。Pythonでは、変数のスコープを適切に管理することで、コードの可読性と保守性を向上させることができる。

ローカルスコープ

関数内で定義された変数はローカルスコープを持ち、その関数の外ではアクセスできない。


def my_function():
    a = 5  # ローカル変数
    print(a)  # 5

my_function()
print(a)  # NameError: name 'a' is not defined

関数内で定義された変数は、関数が終了すると自動的に破棄される。

グローバルスコープ

関数の外で定義された変数はグローバルスコープを持ち、プログラム全体でアクセスできる。


x = 10  # グローバル変数

def my_function():
    print(x)  # 10 (グローバル変数にアクセス)

my_function()
print(x)  # 10

ただし、関数内でグローバル変数に値を代入するとエラーが発生する。


x = 10

def my_function():
    x = x + 5  # UnboundLocalError: local variable 'x' referenced before assignment

my_function()

これは、Pythonが `x = x + 5` をローカル変数 `x` を用いた操作と解釈するためである。

nonlocal変数

関数内にネストした関数がある場合、外側の関数の変数を `nonlocal` キーワードを使って変更できる。


def outer():
    x = 10
    def inner():
        nonlocal x
        x += 5
        print(x)  # 15
    inner()
    print(x)  # 15

outer()

名前空間とLEGBルール

Pythonの変数スコープには、LEGBルールが適用される。

  • L (Local): 関数内で定義された変数
  • E (Enclosing): 外側の関数の変数(nonlocalが適用される)
  • G (Global): モジュールレベルの変数
  • B (Built-in): Pythonの組み込み関数

このルールを理解することで、Pythonの変数のスコープを適切に管理できる。

global文の使い方

関数内でグローバル変数を変更するには、`global` 文を使う。


x = 10

def update_global():
    global x
    x += 5
    print(x)  # 15

update_global()
print(x)  # 15

nonlocal文の使い方

`nonlocal` 文を使うと、ネストした関数の外側の変数を変更できる。


def outer():
    y = 20
    def inner():
        nonlocal y
        y += 10
        print(y)  # 30
    inner()
    print(y)  # 30

outer()

変数スコープに関するベストプラクティス

  • できるだけローカル変数を使用し、グローバル変数を避ける。
  • 関数のネストを適切に行い、スコープを明確にする。
  • `global` や `nonlocal` の使用は最小限にし、可読性を向上させる。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です