gpt4 book ai didi

python - Python 3.x 和 Python 2.7 中 dict.values() 和 dict.keys() 相等之间的行为不一致

转载 作者:IT老高 更新时间:2023-10-28 21:55:03 25 4
gpt4 key购买 nike

我发现将 dict 内置的 keys()values() 方法的结果与自己的结果进行比较结果不一致:

instance = {'one': 1}

instance.values() == instance.values() # Returns False
instance.keys() == instance.keys() # Returns True

在 Python 2.7 中运行上述代码将为这两个调用返回 True,这让我相信 Python 3 的 dict_values 中存在一些实现细节会导致这种奇怪的行为。

这种行为是有原因的还是我偶然发现了一些不为人知的错误?

最佳答案

简短的回答:class dict_values没有 __eq__方法已实现,但 class dict_keys确实:

>>> d.values().__eq__(d.values())
NotImplemented
>>> d.keys().__eq__(d.keys())
True

因此,d.values()==比较结果为 False .

为什么它没有被实现的更长的答案是一个不同的答案,可以在 the documentation of dict-view objects 上进行更多的挖掘。 .这部分似乎特别相关(强调我的):

Keys views are set-like since their entries are unique and hashable.If all values are hashable, so that (key, value) pairs are unique andhashable, then the items view is also set-like. (Values views are nottreated as set-like since the entries are generally not unique.) Forset-like views, all of the operations defined for the abstract baseclass collections.abc.Set are available (for example, ==, <, or ^).

由于键必须是唯一的,因此它们类似于集合并受 collections.Set 的类操作支持是有意义的。 .由于非唯一性,值不像集合。

在 Python 2.7 中,d.keys()d.values() 两者都返回 list per the documentation ,所以如果你尝试 ==,你会得到普通的列表比较.当然,由于不能保证列表按任何特定顺序进行,因此比较实际上并不能满足您的要求,但如果您真的想要,您可以执行比较:

x = {0: 'x', 16: 'x'}
y = {16: 'x', 0: 'x'}

# prints False twice - you'd get True on Python 3.
print x.keys() == y.keys()
print x.items() == y.items()

如果您使用 viewkeysviewvalues as mentioned in the documentation of dict-view objects in Python2.7 ,那么您可以期待与 Python 3 类似的行为:

# Python 2.7
from collections import Set
# in Python 3.x this would be from collections.abc import Set

d = {"one": 1}

print isinstance(d.viewkeys(), Set)
# True

print isinstance(d.viewvalues(), Set)
# False

print d.viewkeys() == d.viewkeys()
# True

print d.viewvalues() == d.viewvalues()
# False

关于python - Python 3.x 和 Python 2.7 中 dict.values() 和 dict.keys() 相等之间的行为不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55026840/

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