2013-06-30 26 views
1

從命令式編程背景來看,令人驚訝的是,賦值運算符「=」使兩個變量名指向內存中的相同位置,而不是從內存中複製內存中的值獨特的對象到另一個。這種模式既出現在本地數據類型(如列表)中,也出現在使用'class'關鍵字定義的類中。然而,我注意到這條規則的一個例外:在Python中使用唯一的內存位置創建對象

a = 2 
if id(a) == id(2): 
    print "The id function returns the object's address in memory." 
a = 3 
if id(a) != id(2): 
    print "The hardcoded integer '2' does not get its address in memory re-assigned to that of 3" 

這兩個條件都滿足了。他們有必要這樣做,否則自然數的構建就會崩潰。有什麼方法可以在我定義的類中利用這個常量?我希望有些課程不像「ls -s」,更像是「cp」。

+0

這僅適用於-5到256之間的整數。請參閱此問題以獲取更詳細的解釋:http://stackoverflow.com/questions/306313/python-is-operator-behaves-unexpectedly-with-integers – Blender

+0

複製模塊/協議(http://docs.python.org/2/library/copy.html)是否提供了您想要的內容,或者您​​是否對覆蓋分配特別感興趣?如果是後者,可以使用描述符協議(http://docs.python.org/2/howto/descriptor.html)獲得類似的內容,但它仍然不是您想要的。 – jcrudy

+0

複製模塊確實提供了我正在尋找的內容。非常感謝你。 – seewalker

回答

0

(這應該是一個評論,但有點長。)

請注意,你似乎依靠的是你的榜樣整數對象,但沒有什麼取決於它和整數並不特別 - - 他們只是普通的物體。 id(x)返回當前存儲在x中的任何對象的標識。因此,如果我們適應你這樣的例子中,我們得到了相同的結果:

object2 = [] # or any object, really 
object3 = [] # or any *other* object 
a = object2 
assert id(a) == id(object2) 
a = object3 
assert id(a) != id(object2) 

約整數唯一特別的是,如果你寫在你的源代碼「2」好幾次,它可能(而且實際上會)被優化來引用相同的整數對象,因爲使用相同的值獲取不同的整數對象是沒有用的。