趣味のPython・深層学習

中級者のための実装集

スコープ: Pythonのスコープの基礎

はじめに

プログラミングにおいて、「スコープ」とは変数や関数の有効範囲のことを指します。Pythonでは、スコープの概念を適切に理解することが非常に重要です。スコープを理解すれば、変数や関数を適切に使用できるようになり、バグの発生を防ぐことができます。 このブログ記事では、Pythonのスコープについて、基礎から応用まで、視覚的かつ丁寧に解説していきます。

スコープとは

スコープとは、変数や関数が有効な範囲のことを指します。Pythonには、以下の4つのスコープがあります。

  • ローカルスコープ (Local Scope): 関数やメソッド内で定義された変数の有効範囲
  • エンクロージングスコープ (Enclosing Scope): 内側の関数から見た外側の関数のスコープ
  • グローバルスコープ (Global Scope): モジュール内で定義された変数の有効範囲
  • ビルトインスコープ (Built-in Scope): Pythonの組み込み関数やモジュールの有効範囲

それでは、各スコープについて詳しく見ていきましょう。

ローカルスコープ (Local Scope)

ローカルスコープとは、関数やメソッド内で定義された変数の有効範囲のことです。ローカル変数は、その関数やメソッド内でのみ有効です。

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

my_function()  # 出力: 10

print(x)  # エラー: x is not defined

上記の例では、xはローカル変数です。my_function()内ではxを参照できますが、関数の外ではxは存在しないため、エラーが発生します。 ローカルスコープのイメージは以下のようになります。

+--------------------------------+
|            my_function()       |
|   +----------------------------+
|   |         ローカルスコープ    |
|   |   x = 10                   |
|   |   print(x)  # 出力: 10     |
|   +----------------------------+
|                                |
+--------------------------------+

print(x)  # エラー: x is not defined

グローバルスコープ (Global Scope)

グローバルスコープとは、モジュール内で定義された変数の有効範囲のことです。グローバル変数は、モジュール内のどこからでも参照できます。

x = 10  # グローバル変数

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

my_function()  # 出力: 10

print(x)  # 出力: 10

上記の例では、xはグローバル変数です。my_function()内でも、外でも、xを参照できます。 グローバルスコープのイメージは以下のようになります。

x = 10  # グローバル変数

+--------------------------------+
|            my_function()       |
|   print(x)  # 出力: 10         |
+--------------------------------+

print(x)  # 出力: 10

エンクロージングスコープ (Enclosing Scope)

エンクロージングスコープとは、内側の関数から見た外側の関数のスコープのことです。内側の関数では、外側の関数のローカル変数を参照できます。

def outer_function():
    x = 10  # outer_function()のローカル変数

    def inner_function():
        print(x)  # outer_function()のxを参照

    inner_function()

outer_function()  # 出力: 10

上記の例では、inner_function()はouter_function()のローカル変数xを参照できます。 エンクロージングスコープのイメージは以下のようになります。

+--------------------------------+
|          outer_function()      |
|   x = 10                       |
|   +----------------------------+
|   |        inner_function()    |
|   |   print(x)  # 出力: 10     |
|   +----------------------------+
+--------------------------------+

ビルトインスコープ (Built-in Scope)

ビルトインスコープとは、Pythonの組み込み関数やモジュールの有効範囲のことです。ビルトインスコープは、すべてのスコープから参照できます。

print(len([1, 2, 3]))  # 出力: 3

上記の例では、len()はPythonの組み込み関数です。どのスコープからでもlen()を呼び出すことができます。 ビルトインスコープのイメージは以下のようになります。

+--------------------------------+
|            ビルトインスコープ    |
|   len(), print(), sum(), ...   |
+--------------------------------+
                |
+--------------------------------+
|            グローバルスコープ    |
|   print(len([1, 2, 3]))        |
+--------------------------------+

スコープの優先順位

Pythonでは、変数の検索時に以下の優先順位でスコープを探索します。

ローカルスコープ エンクロージングスコープ グローバルスコープ ビルトインスコープ

つまり、ローカルスコープから順に探索を行い、最初に見つかった変数が使用されます。

pythonCopy codex = 10  # グローバル変数

def outer_function():
    x = 20  # outer_function()のローカル変数

    def inner_function():
        x = 30  # inner_function()のローカル変数
        print(x)  # 出力: 30

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

outer_function()
print(x)  # 出力: 10

上記の例では、各関数内でxが定義されています。inner_function()では最も内側のローカル変数xが使用され、outer_function()では外側のローカル変数xが使用されます。最後に、グローバル変数xが参照されます。