为什么`dict in dict`和`key in dict.keys()`有相同的输出?

11 python dictionary

我试图在字典中搜索键,但我忘了添加该keys()功能.我仍然得到了预期的答案.

为什么这两个表达式的结果相同?

key in dict
Run Code Online (Sandbox Code Playgroud)

key in dict.keys()
Run Code Online (Sandbox Code Playgroud)

Ant*_*ala 26

要理解为什么key in dct返回与key in dct.keys()过去需要的结果相同的结果.历史上在Python 2,一个将测试的存在在字典dctdct.has_key(key).对于Python 2.2来说,这是改变的,当首选的方式成为时key in dct,它基本上做了同样的事情:

在一个小的相关变化中,in操作员现在使用字典,所以key in dict 现在相当于dict.has_key(key)

行为in是根据__contains__dunder方法在内部实现的.其行为记录在Python语言参考中 - 3数据模型:

object.__contains__(self, item)

被称为实施会员测试运营商.如果item为in self,则返回true ,否则返回false.对于映射对象,这应该考虑映射的键而不是值或键 - 项对. 对于未定义的对象,__contains__()成员资格测试首先尝试迭代__iter__(),然后是旧的序列迭代协议__getitem__(),请参阅语言参考中的此部分.

(强调我的; Python中的字典是映射对象)

Python 3中,在has_key被完全删除方法,现在有正确的方法来测试键的存在完全是key in dict,为记录.


在与上述2的对比,key in dct.keys()从来没有正确的测试在字典中是否存在一个关键的途径.你的两个例子的结果确实是相同的,但是key in dct.keys()在Python 3上稍微慢一点,而且在Python 2上非常慢.

key in dct返回true,如果在几乎恒定的时间操作中key找到一个键dct- 无论是否有两个或一百万个键 - 它的时间复杂度在平均情况下是恒定的(O(1))

dct.keys()在Python 2中创建了list所有键; 并在Python 3中查看键; 这两个对象都理解了key in x.使用Python 2,它适用于任何可迭代的 ; 迭代值,并True在一个值等于给定值(此处key)时返回.

实际上,在Python 2中,你发现key in dct.keys()要慢得多key in dict(key in dct.keys()与键的数量成线性关系 - 它的运行时复杂度为O(n).)

在Python 3,dct.keys()不会比慢得多key in key_list视图不会使键的列表,并且所述访问仍然是O(1) ,但在实践中这将是由至少一个恒定值慢,并且它还有7个字符,因此没有理由使用它,即使在Python 3上也是如此.