Python 速習チュートリアル

Python のスコープ

1. スコープ (Scope)

変数(Variable)は、それが作成されたリージョン(領域)内でのみ利用可能です。これをプログラミングの世界ではスコープ(Scope)と呼びます。

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

関数(Function)の内部で作成された変数は、その関数のローカルスコープに属し、その関数内でのみ使用できます。

2.1 ローカル変数の例

関数内で作成された変数は、関数外部からは参照できません。

def myfunc():
  x = 300 # ローカルスコープの変数
  print(x)

myfunc()

2.2 関数内の関数 (Function Inside Function)

上記の例のように、変数 x は関数の外部からは利用できませんが、その関数内にある別の関数(ネストされた関数)からはアクセスすることが可能です。

def myfunc():
  x = 300
  def myinnerfunc():
    print(x) # 親関数のローカル変数を参照
  myinnerfunc()

myfunc()

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

Python コードのメインボディ(関数の外側)で作成された変数はグローバル変数であり、グローバルスコープに属します。
グローバル変数は、グローバルスコープ内だけでなく、任意の関数内部(ローカルスコープ)からもアクセスすることが可能です。

3.1 グローバル変数の例

関数の外で定義された変数は、どこからでも読み取ることができます。

x = 300 # グローバル変数

def myfunc():
  print(x)

myfunc()

print(x)

3.2 変数の命名 (Naming Variables)

関数内と関数外で同じ名前の変数を操作した場合、Python はそれらを 2 つの別個の変数として扱います。一方はグローバルスコープに属し、もう一方は関数内のローカルスコープに属します。

x = 300 # グローバルな x

def myfunc():
  x = 200 # ローカルな x
  print(x)

myfunc() # 200 を出力

print(x) # グローバルな 300 を出力

4. global キーワード

通常、関数内で変数を作成すると、それはローカル変数となり、その関数内でしか利用できません。しかし、global キーワードを使用すれば、関数内からグローバル変数を作成したり、既存のグローバル変数を更新したりすることができます。

4.1 global キーワードによる宣言

関数内からグローバルスコープの変数を定義する例です。

def myfunc():
  global x
  x = 300 # global 宣言により、この x はグローバル変数になる

myfunc()

print(x)

また、関数内から既存のグローバル変数の値を変更したい場合にも global を使用します。

x = 300

def myfunc():
  global x
  x = 200 # グローバルな x を 200 に更新

myfunc()

print(x) # 200 を出力

5. nonlocal キーワード

nonlocal キーワードは、ネストされた関数(関数の中の関数)において使用されます。このキーワードを使うことで、その変数がローカルスコープではなく、一つ外側の関数(エンクロージングスコープ)に属していることを明示できます。

5.1 nonlocal の使用例

内側の関数から外側の関数の変数を変更する例です。

def myfunc1():
  x = "最初"
  def myfunc2():
    nonlocal x
    x = "変更後"
  myfunc2()
  return x

print(myfunc1())

このように nonlocal を使うことで、クロージャ(Closure)などの高度な実装において、外側の状態を適切に管理することが可能になります。