{category}

Python - グローバルとノンローカル

nonlocal

ノンローカル(モジュールとパッケージ

意味 内側の関数から変更


nonlocalとは?

nonlocal文は、Pythonのプログラムで、ネストされた関数(関数の中にさらに定義された関数)の中で、外側の関数の変数を操作したいときに使われます。nonlocal文を使わないと、内側の関数で同じ名前のローカル変数が作られてしまい、外側の関数の変数を変更できません。

nonlocalの具体的な使い方

カウンタークロージャの実装

def create_counter():
    count = 0
    
    def increment():
        nonlocal count
        count += 1
        return count
    
    def decrement():
        nonlocal count
        count -= 1
        return count
    
    def get_count():
        return count
    
    return {
        "increment": increment,
        "decrement": decrement,
        "get_count": get_count
    }

# カウンターを作成
counter = create_counter()

# カウンターを操作
print(counter["increment"]())  # 1を出力
print(counter["increment"]())  # 2を出力
print(counter["decrement"]())  # 1を出力
print(counter["get_count"]())  # 1を出力

👇出力結果

1
2
1
1

この例では、`nonlocal`キーワードを使ってクロージャ内のカウンター変数を操作するカウンターを実装しています。`create_counter`関数は、カウントを増やす`increment`関数、減らす`decrement`関数、現在のカウントを取得する`get_count`関数を含む辞書を返します。各関数内で`nonlocal count`を使用することで、外部関数の`count`変数を直接操作できます。

状態を持つデコレータの実装

def count_calls(func):
    call_count = 0
    
    def wrapper(*args, **kwargs):
        nonlocal call_count
        call_count += 1
        print(f"{func.__name__}関数は{call_count}回目の呼び出しです。")
        return func(*args, **kwargs)
    
    return wrapper

@count_calls
def greet(name):
    return f"こんにちは、{name}さん!"

# 関数を複数回呼び出す
print(greet("太郎"))
print(greet("花子"))
print(greet("次郎"))

👇出力結果

greet関数は1回目の呼び出しです。
こんにちは、太郎さん!
greet関数は2回目の呼び出しです。
こんにちは、花子さん!
greet関数は3回目の呼び出しです。
こんにちは、次郎さん!

この例では、`nonlocal`キーワードを使って関数の呼び出し回数を追跡するデコレータを実装しています。`count_calls`デコレータは、内部に`call_count`変数を持ち、デコレートされた関数が呼び出されるたびにこの変数をインクリメントします。`wrapper`関数内で`nonlocal call_count`を使用することで、外部関数の`call_count`変数を直接操作できます。

nonlocalに関するよくある質問

Q. nonlocalの使用場面は?
A. nonlocalは、ネストされた関数(関数の中に定義された関数)で、直接外側の関数のローカル変数を参照・変更したい場合に使用します。
Q. nonlocalとglobalの違いは?
A. nonlocalは直接外側の関数のローカル変数を参照するのに対し、globalはグローバルスコープの変数を参照します。nonlocalは関数のネストが必要ですが、globalはどのスコープでも使用できます。
Q. nonlocalを使わないとどうなる?
A. nonlocalを使わずに内部関数で外部関数の変数を変更しようとすると、新しいローカル変数が作成されてしまい、外部関数の変数は変更されません。これにより、意図した動作にならない可能性があります。

nonlocalが学べる書籍の紹介

「プログラミング単語帳」を使って、プログラミングの単語を英単語のように学習してみませんか?
プログラミング単語帳には、Pythonのnonlocalやfrom package.subpackage import module、import、from . import module、などのような実務でよく使われる単語が数百以上収録されています。
この書籍には、プログラミングの単語の意味や読み方、単語の使い方がわかる例文などが掲載されており、いつでもどこでもプログラミングの学習ができます。

よく使われる単語にだけ絞って学習することができるので、効率的にプログラミングが学習できます。

1日5分の暗記でプログラミンが身に付く!プログラミング単語帳 公式ストアで発売中!

HTML編、CSS編、JavaScript編、PHP編、Ruby編、その他単語編の6シリーズ分が公式ストアにて販売中です。気になった方はぜひ購入してみてください。


Pythonを学べる「プログラミング単語帳」アプリ

プログラミング単語帳がアプリになりました!Pythonはもちろん、10種類のプログラミング言語の中から、よく使われる単語をスマホで学習できます。

収録単語は2,000単語以上!
現在は、HTML、CSS、JavaScirpt、PHP、Laravel、Ruby、Python、MySQL、Linux、など10カテゴリーの単語帳が1つのアプリに収録されています。

いつでも、どこでも、隙間時間を有効活用して、プログラミングを効率的に学べるので、ぜひダウンロードしてみてください。

2024年7月アップデート情報:「Laravel」カテゴリーが追加されましました!

2024年8月アップデート情報:「MySQL」「Linux」カテゴリーが追加されましました!


関連するそのほかの単語

from package.subpackage import module

パッケージからモジュールを読み込む

種類: 絶対インポート

import

外部機能の取り込み

種類: モジュールのインポート

from . import module

現在のフォルダからインポート

種類: 相対インポート

/=

除算と代入

種類: 代入演算子

//

割り算(整数)

種類: 算術演算子