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定义的哈希表中?
看起来,当你定义一个dict时,键值对会弹出全局命名空间,而不包含在hash-table结构定义的命名空间中。
有人知道这个的详细原因吗?
答案 0 :(得分:2)
几个前言
=
时,新变量仅引用旧列表键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
参考
中找到推荐答案 1 :(得分:1)
这是Python初学者陷入的经典陷阱。 Python中的某些对象是不可变的(例如整数,字符串,元组)。某些对象是可变的(例如:列表,字典,实例)。
如果修改了一个可变对象,那么引用该对象的所有其他对象都将看到修改后的值。
如果您不想修改ddic [' c']则必须复制
n2 = list(ddic['c'])
n2[-2] = 1000
ddic
{'a': 10,'b': 23,'c': [0, 1, 2]}
答案 2 :(得分:1)
n2
是对dict中列表对象的引用。当您访问ddic['c']
时,您指向dict中的相同列表对象,而不是它的副本。