1

最初,變量a,b和c都具有值1和相同的地址。當變量a遞增1時,地址被改變,而變量b和c的地址保持相同。有人可以詳細說明這個地址分配嗎?將Python地址分配給變量

現在,當變量b增加1,b的地址現在等於a的地址。有人可以詳細說明這一點嗎?

>>> a = 1 
>>> b = a 
>>> c = b 
>>> a += 1 
>>> print a,b,c 
2 1 1 
>>> id(a) 
26976576 
>>> id(b) 
26976600 
>>> id(c) 
26976600 
>>> b += 1 
>>> print a,b,c 
2 2 1 
>>> id(c) 
26976600 
>>> id(b) 
26976576 
>>> id(a) 
26976576 
+0

請閱讀http://nedbatchelder.com/text/names.html。另請注意,問題的第二部分是實現細節 - CPython實施小整數,這不是您應該依賴的行爲。 – jonrsharpe

回答

0

您看到這個的原因是因爲您在考慮變量a,bc作爲對象,實際上它們是您的示例的對象中的整數。你正在尋找,當你鍵入id()在存儲位置是爲int對象1位置和int對象2,而不是變量名abc

在python中,名稱綁定到對象。如果您有類似lists這樣的可變項,並且您嘗試複製它們,則這可能會有問題。更改對象意味着,當您輪詢兩個引用時,您會看到兩者都傳播了更改,但這並不總是您想要的,除非您意識到它會在調試過程中導致很多問題。

回到你的例子,我在開頭添加了兩個id()實例,顯示整數對象的ID爲12。這應該爲你澄清事情。

>>> a = 1 
>>> b = a 
>>> c = a 
>>> id(a) 
4298174296 
>>> id(b) 
4298174296 
>>> id(c) 
4298174296 
>>> id(1) 
4298174296 
>>> id(2) 
4298174272 
>>> a += 1 
>>> id(a) 
4298174272 
>>> id(b) 
4298174296 
>>> id(c) 
4298174296 
>>> b += 1 
>>> print a, b, c 
2 2 1 
>>> id(c) 
4298174296 
>>> id(b) 
4298174272 
>>> id(a) 
>>> 4298174272 

正如你所看到的,對於1a b c位置最初都是相同的,爲2的位置是不同的。然後,當您更改a的作業時,它指向2的位置,而bc保持指向1。然後,當您重新指定b時,它也指向2的位置,並且只保留c指向1.

希望能夠爲您澄清它。

1

https://docs.python.org/2/c-api/int.html#c.PyInt_FromLong

當前實現保持整數對象爲-5和256之間的所有整數數組,當你在這個範圍內創建一個int,你其實只是回到現有的引用目的。

此外,在Python中,Integer來自不可變的對象:PyIntObject。一旦你創建了PyIntObject,你永遠不會改變它的價值,其他的只是參考。

1

值和內存地址都是誤導性的術語。考慮對象,名稱和ID。首先將對象1分配給名稱a,bc。所以這個對象的ID可以通過所有的名字到達。

在第二步中,將一個新對象(整數2)與其他ID分配到名稱a

在第三步中,您還將對象integer 2也指定爲b。這是CPython的一個實現細節,小整數只在內存中保存一次,因此名稱爲b的對象及其ID爲a