4

リストでこれが発生した理由と、別のリストに追加した後にリストをクリーンアップする方法を誰かが説明できますか?

>>> t = {}
>>> t["m"] = []
>>> t
{'m': []}
>>> t["m"].append('qweasdasd aweter')
>>> t["m"].append('asdasdaf ghghdhj')
>>> t
{'m': ['qweasdasd aweter', 'asdasdaf ghghdhj']}
>>> r = []
>>> r.append(t)
>>> r
[{'m': ['qweasdasd aweter', 'asdasdaf ghghdhj']}]
>>> t["m"] = []
>>> r
[{'m': []}]
4

5 に答える 5

10

それは正常な動作です。Python は参照を使用して要素を格納します。r.append(t)python を実行すると に保存さtrます。t後で変更すると、同じオブジェクトなのでtinも変更されます。r

t に格納されている値から独立させたい場合rは、それをコピーする必要があります。copy モジュールを見てください。

于 2013-04-19T10:44:15.547 に答える
2

電話をかけると、「リストの最後にr.append(t)格納されている値への参照を格納する」と言っています。ディクショナリ参照はコピーされないため、変更する場合は によって参照されるデータを変更します。trttr

この動作は、次の場所でより明確に確認できます。

>>> x = []
>>> y = x
>>> x.append(1)
>>> y
[1]

これはyによって参照される値に設定されるxため、x変更するとそれも変更されるように見えyます。

于 2013-04-19T10:47:34.280 に答える
1

これは正常です。オブジェクトを変数に割り当てると、Python はそのオブジェクトを変数にコピーしません。元のオブジェクトの参照を新しいオブジェクトに割り当てるだけです。

In [1]: a = [1,2]   
In [2]: b = a
In [3]: a.remove(1)
In [4]: b
Out[4]: [2]

ここで b は元のリスト a の参照のみを保持します。この動作をオーバーライドしたい場合は、copy モジュールを使用できます。

In [7]: import copy
In [8]: a = [1,2]
In [9]: b = copy.deepcopy(a)
In [10]: a.remove(1)
In [11]: b
Out[11]: [1, 2]

deepcopy は、個々の要素を含むすべてを複製します。

于 2013-04-19T11:09:37.190 に答える
1

辞書は Python で変更可能です。代わりにコピーを使用してください

>>> import copy
>>> r.append(copy.copy(t))
>>> t
{'m': ['qweasdasd aweter', 'asdasdaf ghghdhj']}
>>> r
[{'m': ['qweasdasd aweter', 'asdasdaf ghghdhj']}]
>>> t["m"]=None
>>> r
[{'m': ['qweasdasd aweter', 'asdasdaf ghghdhj']}]
于 2013-04-19T10:46:55.697 に答える