2012-08-16 15 views
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バージョン:Pythonの3.xでは2.7

+1

python 3はこの目的のために '非ローカル 'を提供しますが、なぜあなたがこれを行う必要があるのか​​を尋ねる価値があると思います。これは 'global'を使うよりも少し安全ですが、それでも正しいとは感じません。 – mgilson

+2

@ mgilsonこれには多くの理由があります。 pep-3104の根拠セクション。 – thebjorn

+0

あなたはどのバージョンのpythonを使用しますか? – soulcheck

答えて

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

回避策は、変更可能なオブジェクトを使用し、そのオブジェクトのメンバを更新することです。名前の束縛はPythonでは難しいですが、時には。

+0

これは動作しますが、辞書の代わりに単一要素のリストを使用することになりました。ありがとう! – Dhara

+5

'nonlocal'や' global'を使うほうが正しいと思います。 – bgusach

+2

グローバルはグローバルな名前空間を汚染するのでお勧めできません。 NonlocalはPython 3の機能です。この質問はPython 2.7を指定しました。 –

38

これが可能である:

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

問題とそれに対する解決策は、同様にPythonの2.xの、this後に与えられています。さらに、このテーマの詳細についてはPEP 3104をお読みください。

+0

私はこれを見ました。 'nonlocal'はここで使うステートメントです。 – mgilson

+0

Python 2.xの非ローカルの代わりにグローバルを使用する – User

+3

@ user1320237グローバルは非ローカルではなく動作しません - それはまさに私の質問でした! – Dhara

関連する問題