2016-06-29 48 views

回答

7

不,他们是不一样的。 is在Python检查,如果两个对象在Python,即相同id。他们是相同的,即使在记忆中。有些事情,你可以做检查的是:

>>> a='foo' 
>>> a is 'foo' 
True 
>>> id(a) 
44434088 
>>> id('foo') 
44434088 
>>> a=[1] 
>>> a is [1] 
False 
>>> id(a) 
45789792 
>>> id([1]) 
4469824 
+3

FWIW,我认为'id(a)'和'id('foo')'是一样的,当他们试图理解python中的身份时经常会让人困惑。事实上,'foo''是由解释程序实现的并不是真正的入门级python主题:-) – mgilson

+0

因此,它是否像对象的散列?如何分配'id'值? – Ares

+0

@Ares正如在'is'中,只有在比较内存中完全相同的对象时才会返回true。 –

2

在Javascript中,当比较平等的话,例如,[] == ""将返回true==运营商将尽隐式类型转换。的操作者===用于检查而不类型转换平等([] === ""返回false。)

在Python中,is关键字检查引用相等。所以x is y只会真,如果xy都指向返回同一个对象在内存中。例如:

x = [1, 2, 3] 
y = [1, 2, 3] 
z = x 
x is y # False 
x is z # True 

可能导致的这方面的一些陷阱都是空,x is None建议的检查。 None总是指向内存中的同一个空间,所以你可以放心,x is None总是返回True如果x具有无值(和False其他)。

您也可能会遇到一些怪癖,如下所示:

x = 1 
y = 1 
x is y # True 

以上是CPython的(也许你正在使用Python解释器),其中小整数是一个不规范的行为的结果在程序启动时全部分配给特定的对象。您可以检查,这并不为更大的数字工作:

x = 1000 
y = 1000 
x is y # False 

除非你检查0​​,或者如果您特别要确保两个变量都指向内存中的同一个位置,你应该使用==而不是is

1

编号为is Python看起来好像是更严格比JS中的===

在JS:

对于值类型(编号):a === b返回真,如果a和b具有 相同的值,并且是同一类型

的对于引用类型:a === b返回真,如果a和b的参考 完全相同的对象

对于字符串:a === b返回true,如果a和b都是字符串并且 包含完全相同的字符


在Python:

没有矛盾,除了id(obj1)相同id(obj2),这两个对象是不相同的,并obj1 is obj2将评估为False