Lists as values in a dictionary Python
本问题已经有最佳答案,请猛点这里访问。
1 2 3 4 5 6 | 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时,键值对似乎会出现在全局命名空间中,并且不会包含在哈希表结构定义的命名空间中。
有人知道具体原因吗?
很少的预言家
- dict键是不可变的,而值是可变的。
- 使用
= 时,新变量只引用旧列表。
键
1 2 3 4 | >>> id(ddic['c']) 140726603094424 >>> id(n2) 140726603094424 |
正如您看到的,两个变量都指向内存中的同一个元素。因此,您在其中所做的任何更改也会反映到原始更改中。
要获得清单的浅显副本,您可以使用BLCKKNGHT提到的
1 | >>> n2 = ddic['c'][:] |
在python3中,您可以使用(如padraic所述)
1 | >>> n2 = ddic['c'].copy() |
使用
1 2 3 4 5 6 | >>> import copy >>> n2 = copy.copy(ddic['c']) >>> id(ddic['c']) 140726603094424 >>> id(n2) 140726603177640 |
参考文献
id copy
同样要注意的是,正如kasra在评论中提到的,dict没有数据结构那样的单独空间。您可以在此文档中找到引用
这是一个经典的Python初学者掉入的陷阱。python中的某些对象是不可变的(例如integer、string、tuple)。有些对象是可变的(例如:列表、字典、实例)。
如果修改可变对象,则引用该对象的所有其他对象都将看到修改后的值。
如果您不想修改DDIC['C'],您必须制作一份副本。
1 2 3 4 5 | n2 = list(ddic['c']) n2[-2] = 1000 ddic {'a': 10,'b': 23,'c': [0, 1, 2]} |