我开始学习python已经有几天了,在这一点上我偶然发现了==和is。来自java背景,我假设==会按对象id进行比较,而is会按值进行比较,但实际上是这样做的
>>> a = (1,2)
>>> b = (1,2)
>>> a is b
False
>>> a == b
True似乎is相当于java的==,而python的==相当于java的equals()。这是思考is和==区别的正确方式吗?还是有一个警告?
发布于 2013-01-04 02:20:19
is检查两个操作数是否为同一对象。==调用左操作数上的__eq__(),传递右操作数。通常,此方法实现相等比较,但也可以编写将其用于其他目的的类(但它永远不会这样做)。
请注意,在某些实现中,is和==将为某些对象(字符串文字,-1和256之间的整数)提供相同的结果,但这并不意味着在这些情况下操作符应该被认为是可替换的。
发布于 2013-01-04 02:15:49
另请参阅
Why does comparing strings in Python using either '==' or 'is' sometimes produce a different result?
发布于 2013-01-04 04:31:11
要跟进@CRUSADER的答案:
==使用eq方法检查对象的相等性。
is检查对象的实际内存位置。如果它们是相同的内存位置,则作为True进行测试
如上所述,为了提高速度,前2**8个整数存储在内存位置,所以要查看使用256以上的其他对象或整数时发生了什么。例如:
In [8]: a = 1001
In [9]: b = a # this sets a pointer to a for the variable b
In [10]: a == b
Out[10]: True # of course they are equal
In [11]: a is b
Out[11]: True # and they point to the same memory location
In [12]: id(a)
Out[12]: 14125728
In [13]: id(b)
Out[13]: 14125728
In [14]: b = 1001 #this instantiates a new object in memory
In [15]: a == b
Out[15]: True
In [16]: a is b
Out[16]: False #now the memory locations are different
In [17]: id(a)
Out[17]: 14125728
In [18]: id(b)
Out[18]: 14125824https://stackoverflow.com/questions/14144707
复制相似问题