“ ==”和“是”之间有区别吗?

瘦欲@ 提交于 2019-12-30 18:37:12

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

这篇文章是 社区维基 。 编辑现有答案以改善此职位。 它当前不接受新的答案。

我的Google Fu使我失败了。

在Python中,以下两个相等测试是否等效?

n = 5
# Test one.
if n == 5:
    print 'Yay!'

# Test two.
if n is 5:
    print 'Yay!'

对于要比较实例的对象( list说),这是否成立?

好的,这样可以回答我的问题:

L = []
L.append(1)
if L == [1]:
    print 'Yay!'
# Holds true, but...

if L is [1]:
    print 'Yay!'
# Doesn't.

因此==测试值,其中is看测试是否是同一个对象?


#1楼

看一下Stack Overflow问题, Python的“ is”运算符在使用整数时表现异常

它主要归结为“ is ”检查它们是否是同一对象,而不只是彼此相等(小于256的数字是特例)。


#2楼

有一条简单的经验法则可以告诉您何时使用==is

  • ==用于价值平等 。 当您想知道两个对象是否具有相同的值时,请使用它。
  • is参考平等 。 当您想知道两个引用是否引用同一对象时,请使用它。

通常,在将某事物与简单类型进行比较时,通常会检查值是否相等 ,因此应使用== 。 例如,您的示例的目的可能是检查x是否具有等于2( == )的值,而不是x是否实际上是指与2相同的对象。


别的东西要注意:因为方式的CPython的参考实现的工作,你会得到意想不到的和不一致的结果,如果你错误地使用is比较对整数参考平等:

>>> a = 500
>>> b = 500
>>> a == b
True
>>> a is b
False

这几乎是我们所期望的: ab具有相同的值,但是是不同的实体。 但是呢?

>>> c = 200
>>> d = 200
>>> c == d
True
>>> c is d
True

这与先前的结果不一致。 这里发生了什么? 事实证明,出于性能原因,Python的参考实现将-5..256范围内的整数对象作为单例实例进行缓存。 这是一个演示此示例:

>>> for i in range(250, 260): a = i; print "%i: %s" % (i, a is int(str(i)));
... 
250: True
251: True
252: True
253: True
254: True
255: True
256: True
257: False
258: False
259: False

这是另一个不使用的明显原因is :当您错误地将其用于值相等时,该行为应由实现决定。


#3楼

正如约翰·费米内拉(John Feminella)所说,大多数时候,您将使用==和!=,因为您的目标是比较值。 我只想对剩下的时间做些什么:

NoneType只有一个实例,即None是一个单例。 因此, foo == Nonefoo is None表示相同。 但是, is测试速度更快,Pythonic约定使用foo is None

如果您要对垃圾收集进行自省或处理,或者检查自定义构建的字符串实习小工具是否正常工作,那么您可能有foo的用例是bar

True和False也是(现在)单例,但是foo == True没有用例,而foo is True没有用例foo is True


#4楼

==确定两个值是否相等,而is确定两个对象是否完全相同且相等。


#5楼

https://docs.python.org/library/stdtypes.html#comparisons

is对身份的测试==对平等的测试

每个(小的)整数值都映射到单个值,因此,每个3都是相同且相等的。 这是实现细节,但不是语言规范的一部分

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!