提问人:Dommondke 提问时间:4/1/2023 最后编辑:mkrieger1Dommondke 更新时间:4/1/2023 访问量:117
从什么时候开始,Python None 等于 None?
Since when is Python None equal to None?
问:
我一直认为 Python 空值不相等,这在许多其他语言中很常见,并且基于简单的逻辑(如果值未知,它怎么可能等于另一个未知数?
但是,最近我尝试了一下,发现:
Python 3.10.2
>>> None == None
True
一直都是这样吗?如果没有,哪个版本更改了它?
答:
4赞
Caleb Carson
4/1/2023
#1
在 python 中,没有一个总是与自身相等。“None == None”始终被评估为 true。
从本文档中可以看出 https://docs.python.org/3/c-api/none.html
由于 None 是单例,因此测试对象身份(在 C 中使用 ==)就足够了。
评论
1赞
Dommondke
4/1/2023
并不是说我不相信你,但你有指向语言规范中定义它的链接吗?
1赞
kindall
4/1/2023
当然,除非另有说明,否则您希望所有值都等于它们本身。
1赞
Caleb Carson
4/1/2023
docs.python.org/3/c-api/none.html 选中“The None Object”
1赞
user2357112
4/1/2023
@CalebCarson:这实际上并没有说明 None 在 Python == 比较中的行为。它简要引用了完全不同的 C== 运算符,但没有提到 Python ==。
0赞
Thyll Müller
4/1/2023
#2
如上所述,这与__eq__如何评估 None == None 有关。
None 是单一实例对象,这意味着在任何给定时间内存中只有一个实例。将变量赋值给 None 时,只需创建对 None 的单个实例的引用。
因此,您的示例就像说“None 是否指向内存中的同一对象和 None?答案是肯定的,因此__eq__应验(True)。
评论
2赞
mkrieger1
4/1/2023
None == None
理论上仍然可以被定义(和实现),即使内存中的对象与 相同。False
None
None
0赞
Thyll Müller
4/1/2023
您@mkrieger1建议以不同于 stdlib 实现的方式实现相等性检查?在这种情况下,我同意,但我认为这不在这个问题的范围之内。Python 始终避免歧义,并且对 None == None(或 None is None)的计算将并且应该始终返回 True。
1赞
chepner
4/1/2023
float.__eq__
紧张地环顾四周。
0赞
Thyll Müller
4/1/2023
@chepner是的......井。。。我想不能满足他们所有人哈哈。说我们需要考虑必要的例外情况,我感到很糟糕,但不幸的是,这里的情况就是这样。我确实认为理解二进制浮点表示的问题就是其中之一,但我认为,迟早每个人都会在自己的工作中偶然发现这个问题。
0赞
chepner
4/1/2023
float
(或者更具体地说,IEEE 754浮点运算)比数学纯度:)更实际
2赞
chepner
4/1/2023
#3
没有明确的陈述是正确的,但早在 Python 1.5.2 中,就有两个陈述暗示了这一点。None == None
首先,在对相等运算符的讨论中:
相同类型的对象的比较取决于类型:
- 数字以算术方式比较。
- 字符串使用其数字等价物(内置函数的结果)在字典上进行比较 字符。
ord()
- 使用相应项的比较按字典顺序比较元组和列表。
- 映射(字典)通过对其排序(键、值)列表的字典比较来进行比较。5,2
- 大多数其他类型比较不相等,除非它们是同一个对象;选择将一个对象视为较小还是较大 比另一个是任意但始终如一地在一个内部制作的 执行程序。
但是,每次使用 ,都是指同一个对象None
2.1.7.7 Null对象
此对象由未显式返回 价值。它不支持任何特殊操作。正好有一个 null 对象,名为
None
(内置名称)。它写成 .
None
评论
NaN
None
NaN
NULL
None