よろずやIT
プログラミング

スコープ(変数の有効範囲)とは?ローカル変数・グローバル変数をPythonで解説

執筆・監修:よろずやIT編集部|編集方針を見る

結論:まずここだけ読めばOK

詳しい手順・原因は、この下で解説しています。

プログラミングのイラスト

結論: スコープは、**変数が「見える範囲」**のことです。**関数の中でつくった変数(ローカル変数)**は、その関数の中だけで使えます。関数の外の変数(グローバル変数)は、関数の中から読むことはできますが、書き換えると別の扱いになります。エラーが出た時は、NameError(見えない変数を使った)と、UnboundLocalError(外の変数を中で書き換えようとした)を疑ってください。

スコープとは

プログラムには、たくさんの変数が登場します。もし、すべての変数が、どこからでも見えて、書き換えられるとしたら、別々の場所で、同じ名前を使った時に、値が混ざってしまいます。

そこで、変数には、**使える範囲(スコープ)**が決められています。変数の基本は、変数とはをご覧ください。

ローカル変数とグローバル変数

関数の外のグローバル変数と、関数の中のローカル変数の見える範囲を示した図解

ローカル変数 グローバル変数
つくる場所 関数の中 関数の外
使える範囲 その関数の中だけ プログラム全体
関数が終わると 使えなくなる 残る
name = "田中"          # グローバル変数

def greet():
    count = 0          # ローカル変数
    print(name)        # 外の変数は、読める
    print(count)

greet()
print(name)            # OK
print(count)           # NameError:関数の外からは、見えない

関数の基本は、関数とはで解説しています。

エラーの原因と直し方

NameErrorとUnboundLocalErrorの原因と、直し方を示した図解

① NameError

def f():
    x = 1

f()
print(x)
# NameError: name 'x' is not defined

x は、関数の中だけで使える変数です。関数の外から使おうとすると、見えないため、エラーになります。

直し方:使いたい値は、return(戻り値)で、外へ渡します。

def f():
    x = 1
    return x

x = f()
print(x)   # 1

② UnboundLocalError

count = 0

def add():
    count = count + 1   # エラー
    return count

add()
# UnboundLocalError: local variable 'count' referenced before assignment

関数の中で count = ... と代入すると、Pythonは、count をこの関数のローカル変数として扱います。右側の count は、まだ値がないローカル変数を読もうとするため、エラーになります。

直し方:外の値は、引数で渡し、結果を戻り値で返します。

def add(count):
    return count + 1

count = 0
count = add(count)
print(count)   # 1

globalキーワード

関数の中から、グローバル変数を書き換えたい時は、global を使うこともできます。

count = 0

def add():
    global count
    count = count + 1

ただし、おすすめしません。

引数と戻り値で受け渡す書き方に、そろえるのが安全です。

ifやforの中でつくった変数

Pythonでは、if や for は、新しいスコープをつくりません。

for i in range(3):
    last = i

print(last)   # 2(ループの外でも、使える)

ループの変数 i も、ループが終わったあとに、使えます。条件分岐やループの基本は、条件分岐(if文)とはと、ループ(繰り返し)とはをご覧ください。

JavaScriptでは

言語によって、ルールが違います。JavaScriptでは、次のようになります。

書き方 スコープ
let / const 波かっこ { } の中だけで使える(ブロックスコープ)
var 関数の中で使える(関数スコープ)

let と const を使うのが、現在の一般的な書き方です。

同じ名前の変数に注意

中と外で、同じ名前の変数を使うと、混乱しやすくなります。

x = 10

def f():
    x = 99      # 外のxとは、別のローカル変数
    return x

f()
print(x)        # 10(外のxは、変わらない)

意味のある、別々の名前をつけると、読みやすくなります。

再帰とスコープ

関数が自分自身を呼ぶ再帰では、呼び出しごとに、別々のローカル変数がつくられます。再帰とはでも、呼び出しごとの値の動きを、図で確認できます。

エラーの確認

症状 原因 対処
NameError その場所から、見えない変数を使った 関数の外で使うなら、return で渡す。綴りも確認する
UnboundLocalError 外の変数を、関数の中で書き換えようとした 引数で渡し、戻り値で返す
外の値が変わらない 中で、同じ名前のローカル変数をつくっている 別の名前にする。戻り値で受け取る

エラーメッセージの読み方は、エラーメッセージの正しい読み方・調べ方をご覧ください。

まとめ

関連記事:変数とは、関数とは、再帰とは、条件分岐(if文)とは、デバッグとは

PRPython イラストで学ぶIT入門 Python初心者と新人SEのための実務につながる基礎学習ガイド【電子書籍】[ 高市 勇気 ]

Python イラストで学ぶIT入門 Python初心者と新人SEのための実務につながる基礎学習ガイド【電子書籍】[ 高市 勇気 ]

¥990

楽天で見る
SHAREXLINEはてブ

よくある質問

Q.スコープとは、何ですか?

A.変数が、プログラムのどの範囲から見えるかを表す言葉です。関数の中でつくった変数は、その関数の中だけで使えます。関数の外でつくった変数は、プログラム全体から読めます。範囲が分かれているのは、別の場所で、同じ名前の変数を使っても、混ざらないようにするためです。

Q.NameErrorが出ました。どうすればいいですか?

A.使おうとした変数の名前が、その場所から見えない時のエラーです。関数の中でつくった変数を、関数の外から使っていないか、名前の綴りが違っていないかを確認します。関数の中の値を外で使いたい時は、return(戻り値)で外へ渡します。

Q.UnboundLocalErrorが出ました。どうすればいいですか?

A.関数の外にある変数を、関数の中で書き換えようとした時のエラーです。関数の中で代入すると、Pythonは、その名前をローカル変数として扱うため、書き換える前の値が見つからなくなります。値を、引数で受け取って、戻り値で返す書き方に直すのが基本です。

Q.globalキーワードは、使っていいですか?

A.関数の中から、グローバル変数を書き換えるために、globalを使うことはできます。ただし、どこで値が変わるのかが分かりにくくなり、バグの原因になりやすいため、なるべく避けて、引数と戻り値で受け渡す書き方をおすすめします。

Q.ifやforの中でつくった変数は、外で使えますか?

A.Pythonでは、ifやforの中でつくった変数は、そのあとも、同じ関数(または、関数の外)の中で使えます。ifやforは、新しいスコープをつくらないためです。JavaScriptのletやconstは、波かっこ{ }の中だけで使えるなど、言語によって、ルールが違います。

関連記事

プログラミング用語解説

関数の引数とは?位置引数・キーワード引数・デフォルト値をPythonで解説

引数とは、関数に渡す値のことです。位置引数・キーワード引数・デフォルト値の違い、引数の数が合わない時のエラー、デフォルト値にリストを使ってはいけない理由を、Pythonの短いコードと図解で解説します。

プログラミング用語解説

辞書(dict)型とは?キーと値で管理する書き方をPythonで解説

辞書(dict)型とは、キーと値のペアでデータを管理する入れ物です。リストとの違い、取り出し方、get()でKeyErrorを防ぐ方法、追加・更新・削除、for文での繰り返しを、Pythonの短いコードと図解で解説します。

プログラミング用語解説

JSONとは?書き方の基本ルールと、よくあるエラーの直し方をやさしく解説

APIや設定ファイルでよく見かけるJSONとは何か。書き方の基本ルール、使えるデータの種類、「カンマ」「引用符」などよくあるエラーの原因まで、初心者向けに解説します。

プログラミング用語解説

Pythonとは?できること・向いている人・始め方を初心者向けに解説

Pythonとは何ができるプログラミング言語なのか。AI・データ分析・自動化・Web開発などの用途、読みやすいと言われる理由、始め方と最初のコード例を、初心者向けに解説します。

最新のIT関連書籍 トップ10

PR / 楽天市場の売れ筋ランキングを定期的に取得しています。価格は変動する場合があるため、購入前に各ストアでご確認ください。