2015-10-04 29 views
2

在與Python的更深入的工作聯繫之後,我已經理解,賦予變量等於創建具有其自己的特定地址的新對象,而不管分配給該變量的變量名稱目的。Python中的對象創建 - 修改後的變量發生了什麼?

在這種情況下,它讓我想知道後來創建和修改的對象會發生什麼。它坐在那裏消耗內存嗎?

記scenarion看起來是這樣的:

# Creates object with id 10101001 (random numbers) 
x = 5 

# Creates object with id 10010010 using the value from object 10101001. 
x += 10 

會發生什麼id爲10101001反對? 出於好奇心,爲什麼對象需要一個ID和一個變量名是變量名,只是給變量名分配地址不是更好嗎?

對於這個問題,我很抱歉提出這個問題可能會引起某人的注意。

+2

''x = 5'創建一個新對象'...不完全正確:http://stackoverflow.com/questions/306313/pythons-is-operator-behaves-unexpectedly-with-integers –

+1

您可能會發現本文很有幫助:[關於Python名稱和值的事實和神話](http://nedbatchelder.com/text/names.html),這是由SO經驗豐富的Ned Batchelder編寫的。 –

+0

@PM 2Ring這是否意味着,如果我有兩個變量具有相同的值但不互相補充,實際上只有一個對象,但具有多個「標籤?」,如:x = 5; y = 5但是隻有一個值爲5的整數對象? –

回答

2

今年,Ned Batchelder在PyCon上發表了一篇關於Python如何管理變量的精彩演講。

https://www.youtube.com/watch?v=_AEJHKGk9ns

我認爲這將幫助清理你的一些混亂。

+0

這很混亂,但非常清晰,謝謝! –

2

首先Augmented assignment statements狀態:

x += 1的增量賦值表達式可以改寫x = x + 1以獲得類似的,但不完全相等的效果。在增強版中,x僅被評估一次。另外,如果可能,實際操作將在原地執行,這意味着不是創建新對象並將其分配給目標,而是修改舊對象。

因此,根據x的類型,這可能不會創建新的對象。

Python是引用計數。因此,ID爲10101001的對象的引用計數遞減。如果此計數爲零,則幾乎立即釋放。但是大多數低範圍整數都是緩存的。所有細節請參閱Objects, Types and Reference Counts

關於對象的id

CPython的實現細節:這是在存儲器中的對象的地址。

所以基本上id和reference是一樣的。變量名稱只是對象本身的綁定。

相關問題