首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >==和is在python中

==和is在python中
EN

Stack Overflow用户
提问于 2013-01-04 02:14:27
回答 4查看 3.1K关注 0票数 12

我开始学习python已经有几天了,在这一点上我偶然发现了==is。来自java背景,我假设==会按对象id进行比较,而is会按值进行比较,但实际上是这样做的

代码语言:javascript
复制
 >>> a = (1,2)
 >>> b = (1,2)
 >>> a is b
 False
 >>> a == b
 True

似乎is相当于java的==,而python的==相当于java的equals()。这是思考is==区别的正确方式吗?还是有一个警告?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-01-04 02:20:19

is检查两个操作数是否为同一对象。==调用左操作数上的__eq__(),传递右操作数。通常,此方法实现相等比较,但也可以编写将其用于其他目的的类(但它永远不会这样做)。

请注意,在某些实现中,is==将为某些对象(字符串文字,-1和256之间的整数)提供相同的结果,但这并不意味着在这些情况下操作符应该被认为是可替换的。

票数 16
EN

Stack Overflow用户

发布于 2013-01-04 02:15:49

票数 22
EN

Stack Overflow用户

发布于 2013-01-04 04:31:11

要跟进@CRUSADER的答案:

==使用eq方法检查对象的相等性。

is检查对象的实际内存位置。如果它们是相同的内存位置,则作为True进行测试

如上所述,为了提高速度,前2**8个整数存储在内存位置,所以要查看使用256以上的其他对象或整数时发生了什么。例如:

代码语言:javascript
复制
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]: 14125824
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14144707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档