从什么时候开始,Python None 等于 None?

Since when is Python None equal to None?

提问人:Dommondke 提问时间:4/1/2023 最后编辑:mkrieger1Dommondke 更新时间:4/1/2023 访问量:117

问:

我一直认为 Python 空值不相等,这在许多其他语言中很常见,并且基于简单的逻辑(如果值未知,它怎么可能等于另一个未知数?

但是,最近我尝试了一下,发现:

Python 3.10.2
>>> None == None
True

一直都是这样吗?如果没有,哪个版本更改了它?

python 相等 nonetype

评论

0赞 Dommondke 4/1/2023
我没有把它和 混淆,@Barmar,问题是关于不.我实际上在考虑像 SQL 这样的事情。NaNNoneNaNNULL
0赞 chepner 4/1/2023
令我有些惊讶的是,官方文档继续将它称为“Null 对象”。None
0赞 Barmar 4/1/2023
SQL NULL 类似于 NaN。Python 没有不是。
0赞 Dommondke 4/1/2023
显然,基于对我问题的回答,它有效地询问 Python None 是否像 SQL NULL......

答:

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 ==。
2赞 chepner 4/1/2023
除非另有定义和记录,否则每个对象都与自身相等; 没有以其他方式记录,并且未定义,而是继承自 。Nonetype(None).__eq__object
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理论上仍然可以被定义(和实现),即使内存中的对象与 相同。FalseNoneNone
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