一些奇怪的行为Python列表和字典

时间:2013-04-19 10:41:41

标签: python list dictionary

任何人都可以解释为什么这会发生在列表中以及如何在追加到另一个列表后清理列表?

>>> 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': []}]

5 个答案:

答案 0 :(得分:10)

这是正常行为。 Python使用对存储元素的引用。 当您执行r.append(t)时,python会将t存储在r中。如果您稍后修改tt中的r也会被修改,因为它是同一个对象。

如果您想使tr中存储的值无关,则必须复制它。查看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复制包括单个元素在内的所有内容。