首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么set()中的set()不引发TypeError,与{} in set()、[] in set()、set()在{}、[] in {}或{}中的{}不同?

为什么set()中的set()不引发TypeError,与{} in set()、[] in set()、set()在{}、[] in {}或{}中的{}不同?
EN

Stack Overflow用户
提问于 2020-07-06 16:01:30
回答 1查看 67关注 0票数 1

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()

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-06 16:28:11

问得好!它似乎没有文档化,但盯着实现代码看上去确实是有意的。虽然集合不能包含设置,但它们可以包含冻结设置。例如,

代码语言:javascript
复制
>>> s = {frozenset({2, 3}), frozenset({5, 7})}
>>> s
{frozenset({2, 3}), frozenset({5, 7})}
>>> type(s)
<class 'set'>

因此,s包含冻结集,但它本身并不是一个冻结集。现在在这方面:

代码语言:javascript
复制
>>> {7, 5} in s
True

set.__contains__()的实现首先试图查看{7, 5}是否在s中。这会在内部引发一个TypeError (“键不可散”)。如果检查某个键会引发类型错误,且该键为set类型,则实现清除该错误,从原始键构建临时冻结集,然后再试一次。

即使如此,我也不会这么做(太神奇了),但也许有一些令人信服的用例,我不知道。

更正

这是文档化的,但是作为set文档的最后一行:

注释,__contains__()remove()discard()方法的elem参数可能是一个集合。为了支持搜索等效的冻结环境,从elem.

创建了一个临时的冻结器。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62759921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档