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稍后修改,tinr也会被修改,因为它是同一个对象。

如果你想t 独立于存储的值,r你必须复制它。看copy 模块。

于 2013-04-19T10:44:15.547 回答
2

当您打电话时,r.append(t)您说的是“存储对存储在t列表末尾的值的引用r”。字典t引用不会被复制,因此当您修改时,您t会修改r.

这种行为可以在这里更清楚地看到:

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

这设置y为所引用的值,x因此当x更改时,它似乎y也会更改。

于 2013-04-19T10:47:34.280 回答
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 回答
1

你可以尝试这样做:

import copy
r.append(copy.deepcopy(t))

这应该有效。

干杯

于 2013-04-19T10:51:21.037 回答
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 复制所有内容,包括单个元素。

于 2013-04-19T11:09:37.190 回答