1. ホーム
  2. python

[解決済み] なぜネストした関数は外側の関数から変数にアクセスできるが、それを変更することはできないのか [duplicate]

2022-11-16 18:55:41

質問

以下の2番目のケースでは、Pythonはローカル変数を探そうとします。それが見つからないとき、なぜ1つ目のケースのように外部スコープを探すことができないのでしょうか?

これはローカルスコープでxを探し、次にアウタースコープを探します。

def f1():
    x = 5
    def f2():
         print x

これは local variable 'x' referenced before assignment というエラーが発生します。

def f1():
    x = 5
    def f2():
        x+=1

私は関数f2()のシグネチャを変更することができないので、xの値を渡すことも返すこともできません。しかし、xを変更する方法は必要です。 global キーワードのようなもの)を探すためにPythonに明示的に伝える方法はありますか?

Python バージョン: 2.7

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

def f1():
    x = { 'value': 5 }
    def f2():
        x['value'] += 1

回避策としては、mutableなオブジェクトを使い、そのオブジェクトのメンバーを更新することです。Pythonでは名前バインディングが厄介なことがあります。