繁体   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