在Python中使用"is"或"=="进行数字比较是否更好?

arg*_*per 55 python

使用"is"运算符或"=="运算符来比较Python中的两个数字是否更好?

例子:

>>> a = 1
>>> a is 1
True
>>> a == 1
True
>>> a is 0
False
>>> a == 0
False
Run Code Online (Sandbox Code Playgroud)

Ign*_*ams 87

使用==.

有时,在一些python实现中,巧合的是,从-5到256的整数将起作用is(例如在CPython实现中).但不要依赖于此或在真实程序中使用它.

  • 定义`__int__`的类在`==`中也不能正常工作; 他们需要定义`__eq__`或`__cmp__` :) (5认同)
  • 这样做的原因是Python在运行时自动创建这些整数而不是动态构造它们以节省时间,因此这些特定的整数在程序中需要之前具有id. (2认同)
  • `is` 运算符*适用于该范围之外的整数,但它们只是具有不同的标识(作为实现细节);我还认为范围是从“-5”而不是“-1” (2认同)

Dav*_*ver 24

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

Python is比较身份 - 它问的问题是"这一件事与其他事物实际上是同一个对象"(类似于==Java).因此,有些时候使用is是有意义的 - 最常见的是检查None.例如,foo is None.但是,一般来说,这不是你想要的.

==另一方面,问一个问题"这一件事在逻辑上等同于另一件事".例如:

>>> [1, 2, 3] == [1, 2, 3]
True
>>> [1, 2, 3] is [1, 2, 3]
False
Run Code Online (Sandbox Code Playgroud)

这是正确的,因为类可以定义用于测试相等性的方法:

>>> class AlwaysEqual(object):
...     def __eq__(self, other):
...         return True
...
>>> always_equal = AlwaysEqual()
>>> always_equal == 42
True
>>> always_equal == None
True
Run Code Online (Sandbox Code Playgroud)

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


Wim*_*Wim 12

>>> a = 255556
>>> a == 255556
True
>>> a is 255556
False
Run Code Online (Sandbox Code Playgroud)

我认为应该回答;-)

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

  • @ujukatzel - 错了.当我运行`a ="这是一个字符串的地狱"; b ="这是一个字符串的地狱"; a是b`我得到'False`作为结果.Python(特别是CPython)只会实现一些小字符串. (3认同)
  • "is"用于比较的唯一安全用途是"无"对象.我想是```对象. (2认同)
  • @Chris Lutz - 虽然您发布的示例确实向我返回了"True",但实际上你是对的,它确实会失败一些更大的字符串. (2认同)

stt*_*ter 7

这只适用于小数字,我猜它也依赖于实现.Python对小数字使用相同的对象实例(iirc <256),但是对于更大的数字,这会改变.

>>> a = 2104214124
>>> b = 2104214124
>>> a == b
True
>>> a is b
False
Run Code Online (Sandbox Code Playgroud)

所以你应该总是==用来比较数字.