为什么字典键不会改变

问题描述 投票:1回答:2
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'改变后不改变键

python dictionary tuples
2个回答
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
投票

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]}

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

© www.soinside.com 2019 - 2024. All rights reserved.