6

Pythonスコープ 同じ質問がありますが、少し異なります。

number = 0
def incrementNumber():
    number += 1

上記のこれは機能しませんが、下のこれはなぜですか?どちらも関数スコープ外です。

number = {'num':0}
def incrementNumber():
    number['num'] += 1

最初のものは、変数をグローバルとして追加すると機能します

number = 0
def incrementNumber():
    global number
    number += 1
4

2 に答える 2

4

このブログ投稿をチェックしてください、それはあなたがしていることに似ています。具体的にはアダムのコメント。

dictionaryVarに割り当てるのではなく、dictionaryVar['A']に割り当てます。したがって、割り当てられることはないため、暗黙的にグローバルになります。実際にdictionaryVarに割り当てると、「期待していた」動作が得られます。

于 2012-10-25T02:12:56.207 に答える
0

最初のケースintでは変更可能ではないので、変更するときは実際にどこのポイントをnumber +=1更新しています。number一般に、明示的に指示せずに変更がアップスコープに伝播することを望まない場合、Pythonはコピーオンライトを実行し、ローカル変数番号を提供します。あなたはその変数をインクリメントし、関数が戻るときにそれは捨てられます

変更可能な辞書の場合、アップスコープの参照を取得してから、基になるオブジェクトを変更するため、追加は関数から伝播されます。

最後のケースでは、数値をローカル変数にしないようにPythonに明示的に指示したため、変更は必要に応じて伝播されます。

関連するPythonクロージャローカル変数

于 2012-10-25T03:30:41.817 に答える