用語比較
globalとnonlocalの違い|再束縛する先のスコープ(Python3基礎)
globalとnonlocalは、どちらも関数の中から外にある変数へ代入し直すための文です。違いは、代入が届く先です。global文はモジュールのグローバルな変数、nonlocal文は外側の関数にある変数を指します。モジュールならglobal、外側の関数ならnonlocalと覚えると、出力を読む問題で迷いません。
Python公式チュートリアル9.2は、global文やnonlocal文が有効でないとき、名前への代入は常に最も内側のスコープで行われると述べています。つまり、関数の中でspam = 1と書くと、外にあるspamは変わらず、関数の中に新しいローカル変数ができます。この動きを変えるのが、2つの文です。
Python3エンジニア認定基礎試験は、公式チュートリアルの内容を章ごとの出題率で出題する形で、第9章のクラスも含まれます。globalとnonlocalは、その9.2「Pythonのスコープと名前空間」で説明されている文です。この記事では、チュートリアルの例と同じ形のコードで、出力の読み方を確認します。
この記事の目次
この記事の根拠と出典
各セクションの見出しの下に、公式資料で確認した内容か編集部の整理かをラベルで示しています。 試験日・料金・申込条件・試験方式は変わることがあるため、申込前に公式サイトで確認してください。Python3エンジニア認定基礎試験の一次情報確認日: 2026-09-18。
結論
global
特定の変数がグローバルスコープに存在し、そこで再束縛されることを指示する。関数の中から、モジュールレベルの変数を書き換えるときに使う。
nonlocal
特定の変数が外側のスコープに存在し、そこで再束縛されることを指示する。入れ子の関数で、外側の関数の変数を書き換えるときに使う。
違いを表で確認
| 比較軸 | global | nonlocal |
|---|---|---|
| 代入が届く先 | モジュールレベル(グローバルスコープ)の変数 | 外側の関数のスコープにある変数 |
| 使う場面 | 関数の中から、モジュールの変数を書き換える | 入れ子の関数の中から、外側の関数の変数を書き換える |
| 何も書かずに代入したとき | 宣言がなければ、関数の中に新しいローカル変数ができ、グローバルな値は変わらない | 宣言がなければ、最も内側のスコープに新しいローカル変数ができ、外側の関数の値は変わらない |
| 参照だけのとき | 宣言しなくても、グローバルな変数を参照できる | 宣言しなくても、外側の関数の変数を参照できる |
| チュートリアルの例での結果 | do_globalの代入は、モジュールレベルのspamの束縛を変更した | do_nonlocalの代入は、scope_test上のspamの束縛を変更した |
Python3エンジニア認定基礎試験の学習に使う書籍(Amazon)
試験範囲を通して読むときの1冊です。読んだ章は、このサイトの章別問題で確かめられます。
どこで迷っているかを切り分ける
関数の中で代入したのに、外の変数が変わらず困っている人
宣言のない代入は、最も内側のスコープに新しい変数を作るだけです。外の変数を書き換えたいなら、外がモジュールならglobal、外側の関数ならnonlocalで宣言します。
値を読むだけでもglobalが必要だと考えている人
チュートリアルは、関数の中では、globalやnonlocalで指定しない限り、外の変数に直接値を代入できないが、参照することはできると説明しています。宣言が必要なのは、代入し直すときです。
出力を読む問題で、どの変数が変わったのか追えない人
代入が、ローカル・外側の関数・モジュールのどの変数に届くかを、宣言から順に確かめます。チュートリアルの例では、3つの代入で3通りの結果になっています。
具体例で使い分ける
例 1
チュートリアルの例で、3つの代入の結果を追う
公式チュートリアル9.2.1の例です。scope_test関数の中でspamに"test spam"を代入し、do_local・do_nonlocal・do_globalの3つの関数を順に呼んで、そのたびにspamを表示します。do_localは宣言なしに"local spam"を、do_nonlocalはnonlocal spamと宣言して"nonlocal spam"を、do_globalはglobal spamと宣言して"global spam"を代入します。
- do_localの後の出力は「After local assignment: test spam」です。宣言のない代入は、do_localの中に新しいローカル変数を作るだけなので、scope_test上のspamは変わりません。
- do_nonlocalの後の出力は「After nonlocal assignment: nonlocal spam」です。nonlocalで宣言した代入が、外側のscope_testのspamを書き換えました。
- do_globalの後の出力は「After global assignment: nonlocal spam」です。global代入はモジュールレベルの束縛を変えるので、scope_testのspamは変わりません。最後にscope_testの外で表示すると、「In global scope: global spam」となります。
結論: 同じspamという名前でも、宣言なし、nonlocal、globalの3通りで、書き換わる先が違います。global代入の前には、モジュールレベルのspamに何も束縛されていなかったことも、この例から分かります。
問題文から答えを選ぶ手順
- 1
関数の中の宣言を探す
関数の本体に、global文かnonlocal文があるかを見ます。なければ、代入はその関数の中の新しいローカル変数になります。
- 2
宣言があれば、書き換わる先を決める
globalならモジュールレベル、nonlocalなら外側の関数のスコープです。
- 3
表示する場所で、どの変数を見ているかを確かめる
print文がどのスコープにあるかで、見えるspamが変わります。
試験での見分け方
- 1global文は、変数がグローバルスコープにあり、そこで再束縛されることを指示する。
- 2nonlocal文は、変数が外側のスコープにあり、そこで再束縛されることを指示する。
- 3宣言のない代入は、最も内側のスコープに新しいローカル変数を作るだけ。参照だけなら宣言は要らない。
誤答しやすい選択肢
nonlocalで、モジュールレベルの変数を書き換えられると考える
修正: nonlocalが指すのは外側のスコープです。モジュールレベルの変数を書き換えるのはglobalです。
関数の中の代入は、いつでも外の変数を書き換えると考える
修正: 宣言がなければ、代入は最も内側のスコープで行われ、新しいローカル変数ができるだけです。
globalの代入で、外側の関数の変数も変わると考える
修正: チュートリアルの例では、global代入の後も、scope_test上のspamは"nonlocal spam"のままでした。
確認問題
Q1関数の中から、モジュールレベルの変数を書き換えるときに使う文は?
答え: global文
特定の変数がグローバルスコープに存在し、そこで再束縛されることを指示します。
Q2入れ子の関数の中から、外側の関数の変数を書き換えるときに使う文は?
答え: nonlocal文
特定の変数が外側のスコープに存在し、そこで再束縛されることを指示します。
Q3global文もnonlocal文も使わずに、関数の中でspam = 1と代入すると、どうなるか?
答え: 関数の中に新しいローカル変数ができる
代入は最も内側のスコープで行われ、外のspamの値は変化しません。
到達チェック
- globalとnonlocalの、書き換えが届く先の違いを言い分けられる
- 宣言のない代入が、新しいローカル変数を作ることを説明できる
- チュートリアルの例の4行の出力を、順に説明できる
関連ページで確認する
同じ資格で次に知りたいこと
- f文字列とformatメソッドの違い(書式化の書き方とフォーマット指定子)
f文字列(フォーマット済み文字列リテラル)とstr.format()メソッドの違いを、公式チュートリアル7.1の例とあわせて解説。Python 3 エンジニア認定基礎試験の第7章で問われる書き方の区別と確認問題つきです。
- printとreturnの違い|画面に出すか、呼び出し元へ値を返すか(Python3基礎)
printとreturnの違いを、画面に表示するか、関数の呼び出し元へ値を返すかで整理します。Python公式チュートリアル4.8のfibとfib2の例、Noneが表示される理由、確認問題つき。
- 辞書内包表記とリスト内包表記の違い(Python 3 エンジニア認定基礎試験)
辞書内包表記とリスト内包表記の違いを、括弧とキー:値の書き方、結果の型、キーの条件、Python 3 エンジニア認定基礎試験での読み取り手順と確認問題まで、公式チュートリアルに沿って解説します。
よくある質問
Qglobalとは?
関数の中で、特定の変数がグローバルスコープに存在し、そこで再束縛されることを指示する文です。モジュールレベルの変数を書き換えるときに使います。
Qnonlocalとは?
関数の中で、特定の変数が外側のスコープに存在し、そこで再束縛されることを指示する文です。入れ子の関数から、外側の関数の変数を書き換えるときに使います。
Qglobalとnonlocalの違いは?
代入が届く先です。globalはモジュールレベルの変数、nonlocalは外側の関数のスコープにある変数を書き換えます。
QPython3基礎試験の範囲?
公式の出題範囲は公式チュートリアルの章単位で、第9章のクラスを含みます。globalとnonlocalは、その9.2「Pythonのスコープと名前空間」で説明されています。出題の形式は受験前に公式の案内で確認してください。
次に見る比較
- G検定・DS検定・統計検定2級で重なる用語10語の比較
同じ名前の用語の定義と収録章を、資格ごとに並べます。
- ベイズの定理と条件付き確率の違い(統計検定2級の式と計算例)
求める確率の向きの違いと、陽性になる確率の計算例を確かめます。
- 紛らわしい用語ペア早見表
混同しやすい用語の違いと判定の手掛かりを、資格別の一覧で確かめます。
執筆: ミナト編集部(運営者情報を見る)
