スコープ

スコープとは、「変数の有効範囲」のことです。「定義した変数を使うことのできる範囲」というイメージで考えましょう。

スコープにはグローバルスコープローカルスコープの2種類があります。

グローバルスコープにある変数をグローバル変数、ローカルスコープにある変数をローカル変数と呼びます。

グローバル変数は、その変数があるPythonファイル(モジュール)のどこからでも使うことができます。一方、ローカル変数は定義されている関数内でのみ使えます。

ローカル変数を関数の外で使うとNameErrorが発生します。

スコープのイメージ

global_spam = 'グローバル変数'

def local_scope():
    local_spam = 'ローカル変数'
    print(global_spam)  # 'グローバル変数'が表示される
    print(local_spam)  # 'ローカル変数'が表示される

 print(local_spam)  # NameErrorが発生する

グローバル変数とローカル変数の名前が重複するとき、ローカルスコープではそのスコープに属するローカル変数が優先されます。

spam = 'グローバル変数'

def local_scope():
    spam = 'ローカル変数'
    print(spam)  # 'ローカル変数'が表示される

 print(spam)  # 'グローバル変数'が表示される

さまざまなスコープと名前空間を参照する

global文を使うことでスコープの外側にある変数を参照することができます。

以下がglobal文を実際に使ったコードと解説です。

spam = 'test spam'  # グローバル変数

def do_local():
    spam = 'local spam'
    print(spam)

def do_global():
    global spam
    spam = 'global spam'  # この変数spamへの代入はグローバル変数への代入になる
    print(spam)

print('グローバル変数の値 ', spam)

do_local()
print('グローバル変数の値 ', spam)

do_global()
print('グローバル変数の値 ', spam)  #  do_global()を実行したため`global spam'と出力される

do_local()関数:

  • この関数のローカル変数spamに ‘local spam’ と代入
  • グローバル変数spamの値は変化しない

do_global()関数:

  • global文によって、do_global()関数の外側(グローバルスコープ)に変数spamを作るイメージ
  • 変数spamに ‘global spam’ と代入(グローバルスコープの変数spamの値を上書きする)

スコープについてさらに詳しく学ぶには、Python3公式ドキュメント-チュートリアル 9.クラスを参照ください。