[英]Some strange behavior Python list and dict
任何人都可以解释为什么这发生在列表中以及如何在附加到另一个列表后清理列表?
>>> 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': []}]
这是正常的行为。 Python使用对存储元素的引用。 当你做r.append(t)
python会将t
存储在r
。 如果稍后修改t
,则还将修改t
in r
因为它是同一个对象。
如果你想t
从存储在独立的价值r
你需要复制它。 查看copy
模块。
当你调用r.append(t)
你会说“存储对列表r
末尾的t
中存储的值的引用”。 字典t
引用不会被复制,因此当您修改t
时,您将修改r
引用的数据。
在这里可以更清楚地看到这种行为:
>>> x = []
>>> y = x
>>> x.append(1)
>>> y
[1]
这将y
设置为x
引用的值,因此当x
更改时, y
也会发生变化。
字典在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']}]
你可以尝试做:
import copy
r.append(copy.deepcopy(t))
这应该工作。
干杯
这很正常。 将对象分配给变量时,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复制包括单个元素在内的所有内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.