2014-10-27 53 views
-2

新手在这里。说我做到以下几点:了解Python名称对象,不可变数据和内存管理

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

我的理解是:

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

请参阅herehere以前有关Python的内存模型和变量的讨论。

所以现在假设以上是正确的我对这种情况一对夫妇的问题:

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

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

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

    我不是问,因为我其实想要这样做,这只是一个学习练习。

+4

您的第三个项目符号不正确; 'b'分配给一个*新的字符串对象* – jonrsharpe 2014-10-27 12:35:36

+0

我站好了。所以'b = a'不会*创建一个新的字符串对象。但'b = a [1]'确实创建了一个新的字符串对象。 – 2014-10-27 12:38:13

+0

是什么让你这么说? 'b = a' *不会*创建一个新对象,'b = a [1]'* does *。 – jonrsharpe 2014-10-27 12:39:30

回答

0

综上所述意见,并给出一个结构性的解释:

"123" 

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

a = "123" 
b = a[1] 

你现在有2个独立的String对象"123""2"。由于b被分配给一个独立的字符串对象,因此更改a将不会影响b。如果你重新分配一个,但是你的字符串对象"123"将会丢失,并且没有办法恢复“1”和“3”抱歉,但是你可能已经知道了。

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