为什么字典键不会改变

时间:2017-12-16 12:06:17

标签: python dictionary tuples

a = (1,2)  
b = {a:1}  
print(b[a]) # This gives 1  
a = (1,2,3)  
print(b[a]) # This gives error but b[(1,2)] is working fine

我理解的是python在更改为(1,2,3)之后不运行垃圾收集器,因为元组(1,2,3)被创建为新对象和元组(1,2)仍然在b中被引用。

我不理解的是为什么'a'在'a'更改后没有更改密钥

2 个答案:

答案 0 :(得分:2)

b = {a:1}创建一个字典,其值a为关键字,1为值。当您为a分配值时,您会创建一个新值,并b重新训练旧值作为其键。

以下使用id的示例可以说明它:

>>> a = (1,2)
>>> b = {a:1}
>>> id(a)
139681226321288
>>> a = (1,2,3)
>>> id(a)
139681416297520
>>> id(b.keys()[0])
139681226321288

答案 1 :(得分:1)

python中的整数,浮点数,字符串,元组是不可变的。字典只允许那些hashable的密钥(不可变的内置对象是可清除的)。由于@Mureinik正确地指出了原因背后的原因,我会给你另一个例子,你可以通过上面的过程改变数据。

>>> l = [1,2,3]
>>> b = {'3' : l}
>>> b
{'3': [1, 2, 3]}
>>> l.append(5)
>>> l
[1, 2, 3, 5]
>>> b
{'3': [1, 2, 3, 5]}

但是,您无法更改字典的,因为它们是经过哈希处理的(只能更新值)。您必须删除现有的键值对或添加新的对。