【问题标题】:Is it better to use "is" or "==" for number comparison in Python? [duplicate]在Python中使用“is”或“==”进行数字比较更好吗? [复制]
【发布时间】:2011-01-15 10:24:27
【问题描述】:

在 Python 中使用“is”运算符还是“==”运算符比较两个数字哪个更好?

例子:

>>> a = 1
>>> a is 1
True
>>> a == 1
True
>>> a is 0
False
>>> a == 0
False

【问题讨论】:

标签: python


【解决方案1】:

使用==

有时,在某些 python 实现中,巧合的是,从 -5 到 256 的整数将适用于 is(例如在 CPython 实现中)。但不要依赖它或在实际程序中使用它。

【讨论】:

  • 定义__int__ 的类也不能与== 一起正常工作;他们需要定义__eq____cmp__ :)
  • 这样做的原因是 Python 在运行前自动创建这些整数,而不是为了节省时间而动态构建它们,因此这些特定的整数在程序中需要之前具有 id。
  • is 运算符 适用 处理超出该范围的整数,但它们只是具有不同的标识(作为实现细节);我也认为范围是从-5 而不是-1
  • @Chris_Rands:我相信范围可能至少改变了一次,但我不确定。
  • @IgnacioVazquez-Abrams 你可能是对的,因为它不能保证,可能会进行编辑以扩大一点:)
【解决方案2】:

其他人已经回答了你的问题,但我会更详细一点:

Python 的 is 比较身份 - 它询问“这件事实际上是否与另一件事相同”(类似于 Java 中的 ==)。因此,有时使用is 是有意义的——最常见的是检查None。例如,foo is None。但是,总的来说,这不是您想要的。

另一方面,== 提出的问题是“这件事在逻辑上是否等同于另一件事”。例如:

>>> [1, 2, 3] == [1, 2, 3]
True
>>> [1, 2, 3] is [1, 2, 3]
False

这是真的,因为类可以定义它们用来测试相等性的方法:

>>> class AlwaysEqual(object):
...     def __eq__(self, other):
...         return True
...
>>> always_equal = AlwaysEqual()
>>> always_equal == 42
True
>>> always_equal == None
True

但他们不能定义用于测试身份的方法(即,他们不能覆盖is)。

【讨论】:

  • is 与 Javascript 的 === 不完全相同,或者至少与问题无关。例如,对我来说 2 ** 12 is 2 ** 12False (这取决于实现),但在 Javascript 中 Math.pow(2, 12) === Math.pow(2, 12)true
【解决方案3】:
>>> a = 255556
>>> a == 255556
True
>>> a is 255556
False

我认为应该回答它;-)

原因是一些经常使用的对象,例如布尔值 True 和 False,所有 1 字母字符串和短数字都由解释器分配一次,并且包含该对象的每个变量都引用它。其他数字和更大的字符串按需分配。例如 255556 被分配了三次,每次创建一个不同的对象。因此,根据is,它们相同。

【讨论】:

  • is 用于比较的唯一安全用途是用于None 对象。我想... 对象。
  • is 将适用于所有字符串,而不仅仅是 1 个字母的字符串。这在 Python 文档中称为字符串实习。
  • @ujukatzel - 错了。当我运行a = "this is one hell of a string"; b = "this is one hell of a string"; a is b 时,我得到False 作为结果。 Python(特别是 CPython)只实习一些小字符串。
  • @Chris Lutz - 尽管您发布的示例确实将True 返回给我,但您确实是对的,对于一些更大的字符串确实会失败。
  • 值得指出的是(至少在 CPython 1.5-3.7 中)255556 is 255556 是真的。这是因为编译器将同一编译单元中的某些不可变常量值折叠为单个值(如 on the other question 所述)。但你的结论是重要的部分:Python 允许合并它想要的任何两个可证明不可变的值,也允许不这样做,并且很少有充分的理由关心特定实现是否真的这样做。
【解决方案4】:

这只适用于小数字,我猜它也依赖于实现。 Python 对小数字使用相同的对象实例(iirc

>>> a = 2104214124
>>> b = 2104214124
>>> a == b
True
>>> a is b
False

因此,您应该始终使用== 来比较数字。

【讨论】:

    【解决方案5】:

    == 是您想要的,“is”恰好适用于您的示例。

    【讨论】:

      【解决方案6】:
      >>> 2 == 2.0
      True
      >>> 2 is 2.0
      False
      

      使用 ==

      【讨论】:

      • 情况变得更糟了。 -9 is -9 在 CPython 中是 False
      猜你喜欢
      • 2015-01-08
      • 1970-01-01
      • 1970-01-01
      • 2011-02-28
      • 2018-02-04
      • 2015-05-16
      • 2011-03-25
      • 2014-07-13
      相关资源
      最近更新 更多