0

dict オブジェクトの値を置き換えようとしています。次のスクリプトが機能します。

> d = {'a': 1}
> def f(d):
>     return {'b': 2}
> d = f(d)
> print d
{'b': 2}

しかし、これはそうではありません:

> d = {'a': 1}
> def replace(d):
>     d = {'b':2}
> replace(d)
> print d
{'a': 1}

なぜ正確に?したがって、辞書全体を変更できるようにするために、すべてのキー
に対して行う必要がありますか?d.pop(k)d.update(...)

4

2 に答える 2

4

再バインドは、変更可能な値をクリアすることと同じではありません。辞書をクリアし、新しいキーと値を与える必要があります。

def replace(d):
    d.clear()
    d.update({'b': 2})

名前 (変数) はオブジェクトへの単なる参照であり、新しい辞書をローカル名にd割り当てると、名前が新しいオブジェクトに再バインドされます。前のオブジェクトは常に影響を受けません。

グローバル名を新しいディクショナリに再バインドするようにグローバルを作成できますdが、その他の残りの参照は変更されていない元のディクショナリを指します。実際の辞書オブジェクトをクリアすると、それを指す参照の数に関係なく機能します。

于 2013-11-11T11:36:06.573 に答える
1

d内部replaceはローカル変数であり、それに代入してもグローバル ディクショナリは置き換えられませんd

globalこれは、キーワードを使用して修正できます。

ただし、ディクショナリをクリアして新しい値を再入力する方が実際には良い場合があります。

于 2013-11-11T11:36:23.167 に答える