了解Python名称对象,不可变数据和内存管理

时间:2014-10-27 12:33:32

标签: python

新手在这里。说我做以下事情:

a = "123"
b = a[1]
a = "abc"

我的理解是:

  • a不是字符串对象。 “123”是一个字符串对象(不确定我正确使用“对象”字 - 可能只是“数据片段”或字符串)由分配了名称a的第一个语句创建。
  • 由于它是一个字符串,“123”是不可变的。
  • b是一个新名称,指向“123”对象的一部分(数字 - 也是一个字符串 - “2”)。 b 是指从“123”复制的新数据。它指的是与a[1]所引用的相同的“2”。
  • 第三个语句将名称a的分配更改为全新的不可变字符串。旧字符串不会更改。无论如何。只更改了名称a
  • python会自动进行垃圾回收,这意味着它会释放内存,因为不再需要数据。

有关Python的内存模型和变量的先前SO讨论,请参阅herehere

所以现在假设上述情况正确我对这种情况有几个问题:

  1. 由于第3行后不再需要a[0]a[2]引用的数据,它是候选者和/或是否可能被垃圾收集?或者,由于b仍然指的是“123”的一部分,整个字符串是否保留,直到没有名字指向任何一块呢?

    我想知道这个,因为例如你有一个非常大的列表对象,并且指向它的唯一剩余名称只使用它的一小部分并且没有名称指向整个事物,看起来这可能是成为内存管理的一个大问题。

  2. 如果字符串确实存在于内存中,直到没有任何名称指向它的任何部分,那么一旦没有名称,是否有某种方法可以返回字符串的其他部分?在上面的示例中:一旦a被重新分配给新字符串,b指向“2”,有没有办法找回“1”和“3”?

    我不是在问,因为我实际上想要这样做,这只是一次学习练习。

1 个答案:

答案 0 :(得分:0)

总结评论并给出结构化解释:

"123"

是一个字符串对象,是不可变的。操作中的char([x])在Python中的字符串对象上返回该字母的副本。单个字母也是一个字符串。

a = "123"
b = a[1]

您现在有2个独立的字符串对象"123""2"。由于b已分配给独立的字符串对象,因此更改ab无效。但是,如果你重新分配了一个,那么你的字符串对象"123"将会丢失,并且无法复活" 1"和" 3"对不起,但你可能已经知道了。

列表对象的工作方式不同。