【推荐】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
这几乎是我们所期望的: a
和b
具有相同的值,但是是不同的实体。 但是呢?
>>> 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 == None
和foo 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都是相同且相等的。 这是实现细节,但不是语言规范的一部分
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3151011