2012-07-17 33 views
1

可能重複:
Python 「is」 operator behaves unexpectedly with integers
Why (0-6) is -6 = False?獲取而減法操作怪異的結果在Python

>>> (0 - 10) is -10 
False 
>>> (0 - 5) is -5 
True 

任何人都可以解釋我,我如何獲得在一個案件和對錯在另一種情況下進行相同的操作...

一些更古怪......

>>> (0 - 10) is (0 - 10) 
False 
+1

另請參見[蟒「是」運算符整數異常行爲(http://stackoverflow.com/q/306313) – 2012-07-17 07:11:42

回答

3

不要使用is平等的測試 - 這是身份的運營商,以及兩個相等的對象不一定是相同的(我。即位於計算機內存中的相同地址下)。一些小整數可能被緩存和重用,但不是全部,這就是爲什麼你在這裏看到不同的結果。

此外,這種行爲是依賴於實現的,所以你不能依賴於這種情況。

2

doc

當前實現保持整數對象爲-5和256之間的所有整數數組,當你在這個範圍內創建一個int,你其實只是回到現有對象的引用。所以應該可以改變1的值。我懷疑在這種情況下Python的行爲是未定義的。 :-)

而且從我的經驗:在我的Python2.7,(0 + x) is x回報Truex-5+256之間,False別處。

+0

不錯......不知道這個:) – avasal 2012-07-17 07:07:33

1

您正在創建int的實例,並期望它們都是相同的對象。對大多數其他物體來說,這通常不起作用,所以也許應該讓你感到驚訝的是你完全得到了True

這樣做的原因就是,Python創建一組在啓動時常用的整數對象,可每當他們被要求重複使用的。這可以解決問題,因爲int是不可變的,但只是一個優化。

1

is運營商將確定兩個對象是否具有相同的身份(在低層次方面,其表示是否在內存中的地址相同)。

a = object() 
a is a 
True 

在Python中,數字對象,就像什麼都重要,所以不管is作品將取決於你如何創建它們。

a = 0 
a is a 
True 

,你的代碼工作在一種情況下,而不是在其他的原因了Python 實習生小整數;也就是說,而非創造-5一個新號碼的對象,將保持小整數的高速緩存,並給您適當的數字對象。在你的情況,另一方面-10沒有拘留那麼Python有創建一個新的數字對象的每個時間。

被攔截的其他對象包括短字符串(包括單字符字符串)和True以及「False」。

你不應該依靠實習;而不是is您應該使用==運算符。

0

可能有一些實現優化可能會重用相同的數字對象。

我想說這就是爲什麼你有時會得到True

$ python3 
Python 3.2.3 (default, May 3 2012, 15:51:42) 
[GCC 4.6.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> id(3) 
9357472 
>>> id(3) 
9357472 

我認爲你正在尋找一個equlity檢查與==

>>> 3 is 3 # Result may depend on implementation details 
True 
>>> 3 == 3 # Always True 
True