为了账号安全,请及时绑定邮箱和手机立即绑定

关于python中元组、字典的可变性。

关于python中元组、字典的可变性。

慕田峪7331174 2019-02-17 17:33:36
对可变对象的疑虑点,请各位大佬指点迷津,多谢! 问题描述: 元组tuple的元素只能容纳不可变对象,且其中的元素可以是列表list,因为实际存放的是列表(可变对象)的地址,只要这个可变列表的地址不变,就算列表中的元素变化了,也不能说是元组元素的变动。 字典dict的key不能是可变元素,因为需要用key去hash取值。如果此时key为列表(可变对象),则字典会报错:TypeError: unhashable type: 'list'。 那么问题来了: 同样是可变元素list,为什么在元组tuple里面作为元素值是合法的、是取地址的、是不可变的,但是在字典dict里面作为key的值就是非法的、是取值的、是可变的。 这样的设计,感觉不符合使用上的一致性或直观的理解性吧,因为规则不一致。
查看完整描述

3 回答

?
烙印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)) # 
查看完整回答
反对 回复 2019-03-01
?
慕虎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]
查看完整回答
反对 回复 2019-03-01
  • 3 回答
  • 0 关注
  • 656 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信