gpt4 book ai didi

python - {frozenset()} 中的 set() 如何/为什么工作?

转载 作者:太空狗 更新时间:2023-10-29 17:07:14 32 4
gpt4 key购买 nike

即使集合不可散列,其他集合中的成员资格检查仍然有效:

>>> set() in {frozenset()}
True

我预计 TypeError: unhashable type: 'set',与 Python 中的其他行为一致:

>>> set() in {}  # doesn't work when checking in dict
TypeError: unhashable type: 'set'
>>> {} in {frozenset()} # looking up some other unhashable type doesn't work
TypeError: unhashable type: 'dict'

那么,set membership in other set是如何实现的呢?

最佳答案

set_containsimplemented like this :

static int
set_contains(PySetObject *so, PyObject *key)
{
PyObject *tmpkey;
int rv;

rv = set_contains_key(so, key);
if (rv < 0) {
if (!PySet_Check(key) || !PyErr_ExceptionMatches(PyExc_TypeError))
return -1;
PyErr_Clear();
tmpkey = make_new_set(&PyFrozenSet_Type, key);
if (tmpkey == NULL)
return -1;
rv = set_contains_key(so, tmpkey);
Py_DECREF(tmpkey);
}
return rv;
}

所以这将直接委托(delegate)给 set_contains_key这实际上将对对象进行哈希处理,然后使用其哈希查找元素。

如果对象不可散列,set_contains_key 返回 -1,所以我们进入 if。在这里,我们明确地检查传递的 key 对象是否是一个集合(或集合子类型的实例)以及我们之前是否得到一个类型错误。这表明我们尝试使用 set 进行包含检查,但失败了,因为它是不可散列的。

在那种情况下,我们现在从那个 set 创建一个新的 frozenset 并再次尝试使用 set_contains_key 进行包含检查。由于 frozensets 是可适当散列的,我们能够通过这种方式找到我们的结果。

这解释了为什么即使集合本身不可哈希,以下示例也能正常工作:

>>> set() in {frozenset()}
True
>>> set(('a')) in { frozenset(('a')) }
True

关于python - {frozenset()} 中的 set() 如何/为什么工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48772631/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com