ホームページ > バックエンド開発 > Python チュートリアル > Python 3 の「nonlocal」キーワードは、入れ子関数スコープの「global」とどう違うのですか?

Python 3 の「nonlocal」キーワードは、入れ子関数スコープの「global」とどう違うのですか?

Patricia Arquette
リリース: 2024-12-15 01:56:09
オリジナル
131 人が閲覧しました

How Does Python 3's `nonlocal` Keyword Differ from `global` in Nested Function Scopes?

Python 3 の "nonlocal" キーワード: 詳細

Python 3 では、"nonlocal" キーワードは貴重な目的を果たし、以下へのアクセスを提供します。予約されたグローバル キーワードに頼らずに、囲むスコープ内で宣言された変数。この微妙な機能により、ネストされた関数内の変数参照に対する例外的な制御が可能になります。

nonlocal の役割を明らかにする

「nonlocal」キーワードを除いた次のコード スニペットを考えてみましょう。

x = 0
def outer():
    x = 1
    def inner():
        x = 2
        print("inner:", x)

    inner()
    print("outer:", x)

outer()
print("global:", x)
ログイン後にコピー

このコードを実行すると、次のものが生成されます。出力:

inner: 2
outer: 1
global: 0
ログイン後にコピー

ご覧のとおり、内側の関数の変数 "x" は外側の関数の変数 "x" から独立しています。これは、内部関数の "x" 変数が独自のスコープ内で優先されるためです。

対照的に、"nonlocal" キーワードを導入すると動作が変更されます。

x = 0
def outer():
    x = 1
    def inner():
        nonlocal x
        x = 2
        print("inner:", x)

    inner()
    print("outer:", x)

outer()
print("global:", x)
ログイン後にコピー

この変更により、出力は次のように変更されます:

inner: 2
outer: 2
global: 0
ログイン後にコピー

「nonlocal」キーワードを使用すると、内部関数で宣言された「x」変数を参照および変更できます。外部関数。

非ローカルとグローバル

「非ローカル」と「グローバル」の違いに注意することが重要です。どちらのキーワードでも、ネストされたスコープから変数にアクセスできますが、目的は異なります。 「nonlocal」は、外側のスコープで定義された変数へのアクセスを制限しますが、「global」は、グローバル スコープで定義された変数へのアクセスを提供します。

より深く理解するには、「global」キーワードを使用した次のコードを検討してください。

x = 0
def outer():
    x = 1
    def inner():
        global x
        x = 2
        print("inner:", x)
        
    inner()
    print("outer:", x)

outer()
print("global:", x)
ログイン後にコピー

この場合、出力は次のようになります。

inner: 2
outer: 1
global: 2
ログイン後にコピー

「グローバル」キーワード バインド"x" を真のグローバルに宣言された変数に置き換え、同じ名前を持つローカル変数または囲まれた変数をオーバーライドします。

結論

Python 3 の "nonlocal" キーワードは、ネストされた関数内の変数参照を管理するための強力なツール。これにより、外側のスコープで宣言された変数に内部スコープ内でアクセスして変更できるようになり、複雑なコード構造での変数の使用をより詳細なレベルで制御できるようになります。

以上がPython 3 の「nonlocal」キーワードは、入れ子関数スコープの「global」とどう違うのですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート