web-dev-qa-db-ja.com

ネストされた関数が外部関数から変数にアクセスできるが、それらを変更することは許可されない理由

以下の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を変更する方法が必要です。 Python Python _ ===外側のスコープ(globalキーワードに似たもの)で変数名を探すように明示的に指示する方法はありますか?

Pythonバージョン:2.7

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

回避策は、可変オブジェクトを使用し、そのオブジェクトのメンバーを更新することです。 Pythonでは、名前のバインドが難しい場合があります。

52
Tom Whittock

Python 3.xでこれが可能です:

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

Python 2.xも同様)の問題とその解決策は、 this 投稿に記載されています。さらに、 PEP 3104 をお読みください=このテーマの詳細については。

69
hochl