任何人都可以解释为什么这会发生在列表中以及如何在追加到另一个列表后清理列表?
>>> 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': []}]
答案 0 :(得分:10)
这是正常行为。 Python使用对存储元素的引用。
当您执行r.append(t)
时,python会将t
存储在r
中。如果您稍后修改t
,t
中的r
也会被修改,因为它是同一个对象。
如果您想使t
与r
中存储的值无关,则必须复制它。查看copy
模块。
答案 1 :(得分:2)
当您致电r.append(t)
时,您说“存储对列表t
末尾r
中存储的值的引用”。不复制字典t
引用,因此当您修改t
时,您修改r
引用的数据。
这种行为在这里可以更清楚地看到:
>>> x = []
>>> y = x
>>> x.append(1)
>>> y
[1]
这会将y
设置为x
引用的值,因此当x
更改时,y
也会发生变化。
答案 2 :(得分: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']}]
答案 3 :(得分:1)
您可以尝试:
import copy
r.append(copy.deepcopy(t))
这应该有用。
干杯
答案 4 :(得分:1)
这很正常。将对象分配给变量时,python不会将该对象复制到变量中。它只是将原始对象的引用分配给新对象。
In [1]: a = [1,2]
In [2]: b = a
In [3]: a.remove(1)
In [4]: b
Out[4]: [2]
这里b只保存原始列表a的引用。如果要覆盖此行为,可以使用复制模块。
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复制包括单个元素在内的所有内容。