作为字典中的值列表Python
ddic = {'a': 10,'b': 23,'c': [0, 1, 2]}
n2 = ddic['c']
n2[-2] = 1000.
ddic
{'a': 10, 'b': 23, 'c': [0, 1000.0, 2]}
为什么更改n2指向的列表,还会更改dict ddic列表,该列表包含在ddic定义的哈希表中?作为字典中的值列表Python
它看起来像是当你定义一个字典时,键值对在全局名字空间中弹出并且不包含在哈希表结构定义的名字空间中。
有人知道这个的详细原因吗?
很少prenotes
- 字典键是不可变的,而值是可变的。
- 当您使用
=
,新的变量只是引用旧名单
在关键c
的值是一个列表。这是指在那个地方的关键。在复制到变量时,参考被传递。这可以通过使用id
来确认。
>>> id(ddic['c'])
140726603094424
>>> id(n2)
140726603094424
正如您所看到的,这两个变量都指向内存中的相同元素。因此,你所做的任何改变都会反映到原来的改变中。
要让列表的浅副本,你可以使用[:]
as mentioned by Blckknght
>>> n2 = ddic['c'][:]
在python3,你可以使用(由Padraic提到的)
>>> n2 = ddic['c'].copy()
使用copy
模块,可以防止这发生在
>>> import copy
>>> n2 = copy.copy(ddic['c'])
>>> id(ddic['c'])
140726603094424
>>> id(n2)
140726603177640
参考
还要注意的是,由Kasra在评论中提到的,类型的字典没有为他们独立的空间,因为它们的数据结构。你可以在this找到参考文档
你也可以注意到'哈希表'没有为他们自己的空白,因为他们是数据结构! http://svn.python.org/view/python/trunk/Objects/dictobject.c?view=markup – Kasramvd 2015-03-31 18:58:18
你的意思是'字典键是不可变的'? – 2015-03-31 18:59:53
@RussellBorogove糟糕! Twas是一个糟糕的错字 – 2015-03-31 19:01:18
这是Python初学者陷入的一个经典陷阱。 Python中的某些对象是不可变的(例如整数,字符串,元组)。某些对象是可变的(例如:列表,字典,实例)。
如果修改可变对象,则所有引用该对象的其他对象都将看到修改后的值。
,如果你不希望修改DDIC [“C”]你必须做出一个副本
n2 = list(ddic['c'])
n2[-2] = 1000
ddic
{'a': 10,'b': 23,'c': [0, 1, 2]}
n2
是在你的字典列表对象的引用。当你访问ddic['c']
时,你指向的是字典中的同一个列表对象,而不是它的副本。
严格来说,该列表既不是“在”字典中,也不是“在”n2中。字典和变量n2都有一个对它的引用。 – 2015-03-31 19:05:36
如果您认为它解决了您的问题,请[接受](http://meta.stackexchange.com/questions/5234)答案。它将使整个社区认识到正确的解决方案。这可以通过点击答案旁边的绿色复选标记来完成。请参阅此[图片](http://i.stack.imgur.com/uqJeW.png)以供参考。干杯。 – 2015-12-09 07:44:10