对可变对象的疑虑点,请各位大佬指点迷津,多谢!
问题描述:
元组tuple的元素只能容纳不可变对象,且其中的元素可以是列表list,因为实际存放的是列表(可变对象)的地址,只要这个可变列表的地址不变,就算列表中的元素变化了,也不能说是元组元素的变动。
字典dict的key不能是可变元素,因为需要用key去hash取值。如果此时key为列表(可变对象),则字典会报错:TypeError: unhashable type: 'list'。
那么问题来了: 同样是可变元素list,为什么在元组tuple里面作为元素值是合法的、是取地址的、是不可变的,但是在字典dict里面作为key的值就是非法的、是取值的、是可变的。
这样的设计,感觉不符合使用上的一致性或直观的理解性吧,因为规则不一致。
3 回答
![?](http://img1.sycdn.imooc.com/5333a0780001a6e702200220-100-100.jpg)
烙印99
TA贡献1829条经验 获得超13个赞
dict 的 key 必须要是能够 hash 的
元组是一组值的序列。 其中的值可以是任意类型, 使用整数索引,
s = ([1,2],[2]) # 有list 存在不能够hash
print(type(s))
print(hash(s))
s2 = list(1,2)
print(hash(s2)) #
![?](http://img1.sycdn.imooc.com/54584eff000195a302200220-100-100.jpg)
慕虎7371278
TA贡献1802条经验 获得超4个赞
你想当然地对“不可变序列”这个词语产生了误解。
首先我们要理解,何为“不可变对象”。
objects whose value is unchangeable once they are created are called immutable.
翻译过来,如果一个对象的value不可改变,那么该对象就是“不可变”的。
然后我们思考下,序列的value是什么东西。
Some objects contain references to other objects; these are called containers. Examples of containers are tuples, lists and dictionaries. The references are part of a container's value.
翻译过来,序列/容器的value就是该序列中的“元素的id”。是元素的id,而不是元素的value,懂了吗?还不懂就看python官方手册的《Data model》章节。
>>> foo=([1,2], [3,4]) #包含可变对象的【不可变序列】
>>> [id(i) for i in foo] #之中所有元素的id,就是【不可变序列】的value
[1747679411912, 1747679411848]
>>> foo[0][0]=5 #修改【不可变序列】的元素的value,而非修改【不可变序列】的value
>>> foo
([5, 2], [3, 4])
>>> [id(i) for i in foo] #【不可变序列】的value没有改变
[1747679411912, 1747679411848]
添加回答
举报
0/150
提交
取消