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'更改后没有更改密钥
答案 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]}
但是,您无法更改字典的键,因为它们是经过哈希处理的(只能更新值)。您必须删除现有的键值对或添加新的对。