2016-06-29 81 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