1. ホーム
  2. python

[解決済み] Pythonでグローバルスコープでなくアウタースコープにある変数を変更することは可能ですか?

2022-05-07 01:50:20

質問

次のようなコードがあります。

def A() :
    b = 1

    def B() :
        # I can access 'b' from here.
        print( b )
        # But can i modify 'b' here? 'global' and assignment will not work.

    B()
A()

のコードについては B() 関数変数 b は外部スコープにありますが、グローバルスコープにはありません。を変更することは可能でしょうか? b の中から B() 関数を使うのですか?確かにここから読み取れますし print() しかし、どのようにそれを変更するのですか?

どのように解決するのですか?

について Python 3 を使用します。 nonlocal キーワード :

nonlocal ステートメントを使用すると、リストされた識別子は、グローバルを除く最も近いスコープで以前にバインドされた変数を参照するようになります。バインディングのデフォルトの動作は、まずローカルの名前空間を検索するため、これは重要なことです。このステートメントを使用すると、カプセル化されたコードで、グローバル(モジュール)スコープ以外のローカルスコープにある変数を再バインドすることができます。

def foo():
    a = 1
    def bar():
        nonlocal a
        a = 2
    bar()
    print(a)  # Output: 2

について Python 2 を使用し、変数を再代入する代わりに値を変異させます。

def foo():
    a = []
    def bar():
        a.append(1)
    bar()
    bar()
    print a

foo()

出力します。

[1, 1]