[英]Immutability in Python
我試圖理解不變性在python中是如何工作的。 因為字符串在python中是不可變的,所以我希望每次執行字符串操作時都會更改id,但它不能按預期工作。 示例:t上的最后一個操作不會更改其ID。 有什么想法嗎?
我在不同的單元格中有一排蘋果[memory containing variables (I will not go to the bit level)]
,其中一些是空的[cells containing garbage / empty value]
。
我拿了一個。 它在單元格3中[logical address = 3]
。
我把它畫成藍色(在我使用未來的技術克隆它之后,用於不變性演示) [committed an operation on it, same could go for addition for integers]
。
我看着它放在哪里,雖然4號細胞是免費的,但是3號細胞也是(因為“原來的”蘋果不再在這里了)! 所以我把它放回到單元格3 [and although we get a "new" apple, it has the same address]
。
你的t
(注意id
是CPython中變量的內存地址),但是因為我們在這里談論“蘋果鏈”(字符串由字符序列組成,我們必須考慮我們的空間量)必須繼續序列,所以如果我的內存看起來像( _
代表任意垃圾數據,'^'代表空間)
H e l l o _ _ _ _ _ B O O M
^ string pointer points here
我想將字符串更改為"Hello you"
,我可以考慮使用可用空間:
H e l l o ^ y o u _ B O O M
^ string pointer points here
但是,如果我想將字符串更改為"Hello world!"
,我必須尋找"Hello world!"
長度的自由空間"Hello world!"
在其他地方(我們可能在"BOOM"
,在垃圾收集環境中很可能,看看你的ID如何不同):
H e l l o ^ y o u _ B O O M _ H e l l o ^ w o r l d ! _ G A R B A G E
^ string pointer points here
只要原始對象不再存在,就可以重復使用對象的ID。 這不是特定於字符串,而是特定於所有Python類型。 對於最簡單的示例,您可以檢查簡單object
的id:
>>> print id(object())
140437485756544
>>> print id(object())
140437485756544
但是,如果我們保留對前一個對象的引用,則不會重用id:
>>> a = object()
>>> id(a)
140437485756544
>>> b = object()
>>> id(b)
140437485756560
通過將中間結果( t
值)附加到列表,可以在測試中使用字符串重現相同的行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.