个人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
看测试是不是同一个对象? 工具
看一下Stack Overflow问题, Python的“ is”运算符在使用整数时表现异常 。 性能
它主要归结为“ is
”检查它们是不是同一对象,而不仅是彼此相等(小于256的数字是特例)。 测试
有一条简单的经验法则能够告诉您什么时候使用==
或is
。 spa
==
用于价值平等 。 当您想知道两个对象是否具备相同的值时,请使用它。 is
为参考平等 。 当您想知道两个引用是否引用同一对象时,请使用它。 一般,在将某事物与简单类型进行比较时,一般会检查值是否相等 ,所以应使用==
。 例如,您的示例的目的多是检查x是否具备等于2( ==
)的值,而不是x
是否其实是指与2相同的对象。 code
别的东西要注意:由于方式的CPython的参考实现的工做,你会获得意想不到的和不一致的结果,若是你错误地使用is
比较对整数参考平等: htm
>>> 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
:当您错误地将其用于值相等时,该行为应由实现决定。
正如约翰·费米内拉(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
。
==
肯定两个值是否相等,而is
肯定两个对象是否彻底相同且相等。
https://docs.python.org/library/stdtypes.html#comparisons
is
对身份的测试==
对平等的测试
每一个(小的)整数值都映射到单个值,所以,每一个3都是相同且相等的。 这是实现细节,但不是语言规范的一部分