2015-06-29 36 views
0

我想知道爲什麼這個評價爲Truepython是否爲int和許多引用存儲一個值?

x = 1 
if x is 1: 
    print "Does x and 1 point to the same object?" 
    print "Does this mean python doesn't store redundant values?" 

它不適用於這種情況,因爲我期望。

x = range(10) 
y = range(10) 
if not x is y: 
    print "I expect this" 

我的理解是,is檢查是否兩個名字都指向同一個對象。這是否意味着python有避免創建冗餘值的機制?

+2

在-5到256之間,是的,它們實際上是相同的對象,具體取決於Python的實現 – CoryKramer

+1

您不應該依賴'is'的結果。 python優化* immutable *內置類型是完全合理的。 '是'是影響結果的**唯一**操作符,所以這並沒有太大的突破。但是,這隻適用於幾種類型,因爲程序創建的大多數對象都屬於應該優化的特定類別(例如整數,列表,字典)。 – Bakuriu

回答

2

這是CPython解釋器的實現細節,但具有小值的整數是「interned」 - 只要表達式的結果落在特定範圍內,就會返回具有相同值的現有int對象。

你可以檢查被使用下面的代碼實習範圍:

interned_range = [i for i in range(-1000, 1000) if i+0 is i] 
print min(interned_range), max(interned_range) 

我CPython的-5和256(含)之間的整數半成品。

作爲實現細節,通常不應該依賴此行爲。

相關問題