新手在这里。说我做到以下几点:了解Python名称对象,不可变数据和内存管理
a = "123"
b = a[1]
a = "abc"
我的理解是:
a
不是字符串对象。 “123”是一个字符串对象(不确定我是否正确使用了“对象”字 - 也许只是“数据块”或字符串),它是由名为a
的第一条语句创建的。- 由于它是一个字符串,“123”是不可变的。
b
是一个新名称,指向“123”对象的一部分(数字 - 也是一个字符串 - “2”)。b
确实不是是指从“123”复制的新数据。它指的是与a[1]
所指的相同的“2”。- 第三条语句将名称
a
的分配更改为全新的不可变字符串。旧的字符串没有改变。无论如何。只有名称a
已被更改。 - python会自动收集垃圾,这意味着它将释放内存,因为不再需要数据。
请参阅here和here以前有关Python的内存模型和变量的讨论。
所以现在假设以上是正确的我对这种情况一对夫妇的问题:
自3行后不再需要,是由
a[0]
和a[2]
提到的数据,是它的候选和/或可能被垃圾收集?或者,因为b
仍然指的是“123”的一部分,是否保留了整个字符串,直到没有名字指向任何一个字符为止?我想知道这个,因为如果你有一个非常大的列表对象,并指向它的唯一剩余名称只使用它的一小部分,没有名称指向整个事情,似乎是这样可能成为内存管理的一个大问题。
如果字符串确实存在于内存中,直到没有名称指向它的任何部分,是否有某种方法可以在字符串的其他部分找回没有名称的字符串?在上面的例子中:一旦
a
已被重新分配到一个新的字符串,并b
指向“2”,有没有办法找回“1”和“3”?我不是问,因为我其实想要这样做,这只是一个学习练习。
您的第三个项目符号不正确; 'b'分配给一个*新的字符串对象* – jonrsharpe 2014-10-27 12:35:36
我站好了。所以'b = a'不会*创建一个新的字符串对象。但'b = a [1]'确实创建了一个新的字符串对象。 – 2014-10-27 12:38:13
是什么让你这么说? 'b = a' *不会*创建一个新对象,'b = a [1]'* does *。 – jonrsharpe 2014-10-27 12:39:30