我试图理解Python中的不可变性是如何工作的。由于字符串在Python中是不可变的,我期望每次执行字符串操作时,id都会发生变化,但实际上并没有像预期的那样工作。
例如:对t进行的最后一个操作不会改变它的id。任何想法为什么?
我试图理解Python中的不可变性是如何工作的。由于字符串在Python中是不可变的,我期望每次执行字符串操作时,id都会发生变化,但实际上并没有像预期的那样工作。
例如:对t进行的最后一个操作不会改变它的id。任何想法为什么?
我有一排苹果存储在不同的单元格中 [内存包含变量(我不会进入位级别)]
,其中一些为空 [单元中包含垃圾/空值]
。
我拿出一个。它在第3个单元格中 [逻辑地址=3]
。
我把它涂成蓝色(使用未来技术克隆它以演示不可变性)[对它进行了操作,对整数也可以进行相同的操作]
。
我看了看要放在哪里,虽然第4个单元格是空的,但第3个单元格也是(因为“原始”苹果不在这里了)!所以我把它放回第3个单元格中 [尽管我们得到了一个“新”的苹果,但它具有相同的地址]
。
对于你的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!"
长度的自由空间(我们可能在"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
>>> a = object()
>>> id(a)
140437485756544
>>> b = object()
>>> id(b)
140437485756560
您可以通过将中间结果(t
中的值)添加到列表中,来在测试中复制相同的行为。
id
的方式)。保证的是活动对象的ID不会改变,并且没有两个不同的(并且活动的)对象将共享相同的ID。 - user4815162342
+=
操作符之前和之后的t
变量的值应该是不同的对象,它们的生命周期(几乎)没有重叠,因此它们不应该共享一个id
。 - user2357112