python基础问题:字典的key可以是元组([1, 2],)这种类型吗?
在python中,字典的key必须是可哈希对象,这意味着它们必须具有不变的哈希值,并且可以被比较以确定相等性。常见的可哈希类型包括字符串、整型、浮点型、布尔、元组和none。然而,列表等不可哈希对象不能用作key。
但是,根据提供的代码示例,将一个元组包裹在另一个元组中允许使用列表作为字典的key。这是因为python会计算元组中所有子元素的哈希值。例如,元组([1, 2],)的哈希值实际上是列表[1, 2]中元素的哈希值的哈希值。
为了更好地理解,让我们来看看元组的__hash__()函数的实现:
立即学习“Python免费学习笔记(深入)”;
static Py_hash_t tuplehash(PyTupleObject *v) { Py_ssize_t i, len = Py_SIZE(v); PyObject **item = v->ob_item; Py_uhash_t acc = _PyHASH_XXPRIME_5; for (i = 0; i < len; i++) { Py_uhash_t lane = PyObject_Hash(item[i]); if (lane == (Py_uhash_t)-1) { return -1; } acc += lane * _PyHASH_XXPRIME_2; acc = _PyHASH_XXROTATE(acc); acc *= _PyHASH_XXPRIME_1; } /* Add input length, mangled to keep the historical value of hash(()). */ acc += len ^ (_PyHASH_XXPRIME_5 ^ 3527539UL); if (acc == (Py_uhash_t)-1) { return 1546275796; } return acc; }
登录后复制
这个函数会对元组中的所有元素进行哈希运算,并将结果组合成一个最终的哈希值。因此,一个包含列表的元组的哈希值实际上是列表中元素的哈希值的哈希值。
需要注意的是,仅仅将不可哈希对象包裹在可哈希对象中并不能保证它是一个有效的字典key。最终,对象的哈希值必须是不可变的。例如,如果要将元组(1, 2, [3, 4])用作字典的key,则会引发typeerror,因为列表[3, 4]的哈希值会在调用__hash__()时改变。
以上就是Python 字典的Key可以是包含列表的元组吗?的详细内容,更多请关注抖狐科技其它相关文章!
-
php替换字符是什么
使用 strtr() 函数可替换字符串中的字符。该函数采用目标字符串以及包含替换字符及其替换值关联数组的两个参数,将目标字符串中的字符与替换数组中的键匹配后进行替换。 strtr() 会返回一个新字符...
-
黑神话悟空老山参怎么获得 老山参药材得到方法
在备受期待的游戏《黑神话:悟空》中,老山参药材的获取成为了玩家们热切渴望的焦点。但是,要得到这珍贵的药材绝非易事。php小编鱼仔带你探索获取老山参药材的秘诀,一起踏上这场奇幻的冒险,揭开隐藏的线索和艰...
-
Vue 中如何动态添加带有动态样式的伪元素?
vue 动态添加具有动态样式的伪元素 在某些情况下,需要根据动态条件向 dom 元素添加带有动态样式的伪元素。例如,元素的伪元素“before”可能只有在满足特定条件时才会出现,并且其样式(如长度、高...
-
心动小镇手游东栈渔家谜底是什么 心动小镇手游东栈渔家谜底介绍
心动小镇游戏近期更新了新版本,带来了一系列新内容。其中引起许多玩家关注的是心动小镇手游东栈渔家的谜底。想知道答案的朋友千万不要错过本篇文章,php小编子墨将为你一一解答。在这篇内容中,我们将深入探索新...
-
碧蓝档案红冬角色
红冬是基沃托斯占地面积最大的学院,其理事会名为“红冬事务局”。因其地处偏僻,联邦理事会的权威很难辐射到此地,所以自治程度要高于一般学院。 红冬可以说是“反逆”的代名词,理事会长经常被推翻,街道上也总能...