AI資格ドリル
資格を選ぶ↓

用語比較

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

特定の変数が外側のスコープに存在し、そこで再束縛されることを指示する。入れ子の関数で、外側の関数の変数を書き換えるときに使う。

違いを表で確認

比較軸globalnonlocal
代入が届く先モジュールレベル(グローバルスコープ)の変数外側の関数のスコープにある変数
使う場面関数の中から、モジュールの変数を書き換える入れ子の関数の中から、外側の関数の変数を書き換える
何も書かずに代入したとき宣言がなければ、関数の中に新しいローカル変数ができ、グローバルな値は変わらない宣言がなければ、最も内側のスコープに新しいローカル変数ができ、外側の関数の値は変わらない
参照だけのとき宣言しなくても、グローバルな変数を参照できる宣言しなくても、外側の関数の変数を参照できる
チュートリアルの例での結果do_globalの代入は、モジュールレベルのspamの束縛を変更したdo_nonlocalの代入は、scope_test上のspamの束縛を変更した

Python3エンジニア認定基礎試験の学習に使う書籍(Amazon)

試験範囲を通して読むときの1冊です。読んだ章は、このサイトの章別問題で確かめられます。

PR

ほかの資格を含む参考書・問題集の一覧を見る

どこで迷っているかを切り分ける

01

関数の中で代入したのに、外の変数が変わらず困っている人

宣言のない代入は、最も内側のスコープに新しい変数を作るだけです。外の変数を書き換えたいなら、外がモジュールならglobal、外側の関数ならnonlocalで宣言します。

02

値を読むだけでもglobalが必要だと考えている人

チュートリアルは、関数の中では、globalやnonlocalで指定しない限り、外の変数に直接値を代入できないが、参照することはできると説明しています。宣言が必要なのは、代入し直すときです。

03

出力を読む問題で、どの変数が変わったのか追えない人

代入が、ローカル・外側の関数・モジュールのどの変数に届くかを、宣言から順に確かめます。チュートリアルの例では、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. 1

    関数の中の宣言を探す

    関数の本体に、global文かnonlocal文があるかを見ます。なければ、代入はその関数の中の新しいローカル変数になります。

  2. 2

    宣言があれば、書き換わる先を決める

    globalならモジュールレベル、nonlocalなら外側の関数のスコープです。

  3. 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行の出力を、順に説明できる

同じ資格で次に知りたいこと

よくある質問

Qglobalとは?

A

関数の中で、特定の変数がグローバルスコープに存在し、そこで再束縛されることを指示する文です。モジュールレベルの変数を書き換えるときに使います。

Qnonlocalとは?

A

関数の中で、特定の変数が外側のスコープに存在し、そこで再束縛されることを指示する文です。入れ子の関数から、外側の関数の変数を書き換えるときに使います。

Qglobalとnonlocalの違いは?

A

代入が届く先です。globalはモジュールレベルの変数、nonlocalは外側の関数のスコープにある変数を書き換えます。

QPython3基礎試験の範囲?

A

公式の出題範囲は公式チュートリアルの章単位で、第9章のクラスを含みます。globalとnonlocalは、その9.2「Pythonのスコープと名前空間」で説明されています。出題の形式は受験前に公式の案内で確認してください。

次に見る比較

執筆: ミナト編集部(運営者情報を見る)