php中文网

Python 字典的Key可以是包含列表的元组吗?

php中文网

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中文网其它相关文章!