sets和dicts是不可理解的,因此不能包含集合、数据集或作为键的列表。即使检查是否包含也会引发TypeError,在所有这五种情况下都是这样:
{} in {}[] in {}set() in {}{} in set()[] in set()但是,检查一个集合是否包含一个集合并不会引发TypeError:
set() in set()返回假。
为什么set() in set()处理方式不同于{} in {}、[] in {}、set() in {}、{} in set()或[] in set()
发布于 2020-07-06 16:28:11
问得好!它似乎没有文档化,但盯着实现代码看上去确实是有意的。虽然集合不能包含设置,但它们可以包含冻结设置。例如,
>>> s = {frozenset({2, 3}), frozenset({5, 7})}
>>> s
{frozenset({2, 3}), frozenset({5, 7})}
>>> type(s)
<class 'set'>因此,s包含冻结集,但它本身并不是一个冻结集。现在在这方面:
>>> {7, 5} in s
Trueset.__contains__()的实现首先试图查看{7, 5}是否在s中。这会在内部引发一个TypeError (“键不可散”)。如果检查某个键会引发类型错误,且该键为set类型,则实现清除该错误,从原始键构建临时冻结集,然后再试一次。
即使如此,我也不会这么做(太神奇了),但也许有一些令人信服的用例,我不知道。
更正
这是文档化的,但是作为set文档的最后一行:
注释,
__contains__()、remove()和discard()方法的elem参数可能是一个集合。为了支持搜索等效的冻结环境,从elem.
创建了一个临时的冻结器。
https://stackoverflow.com/questions/62759921
复制相似问题