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

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

个人Google Fu使我失败了。 html

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

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

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

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

好的,这样能够回答个人问题: app

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楼

有一条简单的经验法则能够告诉您什么时候使用==isspa

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

一般,在将某事物与简单类型进行比较时,一般会检查值是否相等 ,所以应使用== 。 例如,您的示例的目的多是检查x是否具备等于2( == )的值,而不是x是否其实是指与2相同的对象。 code


别的东西要注意:由于方式的CPython的参考实现的工做,你会获得意想不到的和不一致的结果,若是你错误地使用is比较对整数参考平等: htm

>>> 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都是相同且相等的。 这是实现细节,但不是语言规范的一部分

相关文章
相关标签/搜索