猿问

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

对可变对象的疑虑点,请各位大佬指点迷津,多谢!

问题描述:

  1. 元组tuple的元素只能容纳不可变对象,且其中的元素可以是列表list,因为实际存放的是列表(可变对象)的地址,只要这个可变列表的地址不变,就算列表中的元素变化了,也不能说是元组元素的变动。
  2. 字典dict的key不能是可变元素,因为需要用key去hash取值。如果此时key为列表(可变对象),则字典会报错:TypeError: unhashable type: 'list'

那么问题来了:
同样是可变元素list,为什么在元组tuple里面作为元素值是合法的、是取地址的、是不可变的,但是在字典dict里面作为key的值就是非法的、是取的、是可变的。

这样的设计,感觉不符合使用上的一致性或直观的理解性吧,因为规则不一致。

慕田峪7331174
浏览 657回答 3
3回答

烙印99

dict 的 key 必须要是能够 hash 的 元组是一组值的序列。 其中的值可以是任意类型, 使用整数索引, s = ([1,2],[2]) # 有list 存在不能够hash print(type(s)) print(hash(s)) s2 = list(1,2) print(hash(s2)) #

慕虎7371278

你想当然地对“不可变序列”这个词语产生了误解。首先我们要理解,何为“不可变对象”。 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]
随时随地看视频慕课网APP

相关分类

Python
我要回答