簡體   English   中英

Python中的不變性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM