Python中的双等号 vs is:两者有何区别?

97
我在Python解释器中运行以下代码:
>>> foo = 10
>>> dir(foo) == dir(10)
True
>>> dir(foo) is dir(10)
False
>>> 

为什么会这样?
1个回答

165

is检查两个参数是否指向同一个对象,==检查两个参数的值是否相等。 dir()返回一个列表,其中包含foo10的相同数据,但是这两个事物的实际list实例是不同的。


63
一个很好的例子是1==True返回True,但是1是True返回False。 - Andrew
9
一个更加直接相关的观点是,除非存在某种解释器优化,否则 dir(10) is dir(10) 不会为 True,而 dir(1) == dir(10) 则会为 True - Silas Ray
3
你可以说在Python中的 "is" 与其他语言(如PHP)中的 "===" 是一样的。 - Máxima Alekz
这可能应该作为一个单独的问题,但是在Python中数字是对象吗?为什么1 is 1返回True - Nathan majicvr.com
4
是的,整数是对象。尝试使用type(1)a = 1;a.__class__等命令。要完全理解整数具有什么身份需要深入解析器的内部(如果记忆无误,有一些内部化处理以及其他单例驱动的优化),但可以简单地说,由整数字面值组成的2个表达式有时可以是相同的对象,有时则不是。例如,在我的Python 3.6中,1 is 1a = 1;b = 1;a is b都为True,但1 is 10 / 10False - Silas Ray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接