我对以下情况感到困惑,也许我的词汇在这里是错误的,所以深表歉意。

假设我们有一个元组x = ('a', []),然后我们做x = (x[0], [1, 2, 3])

由于新的元组引用了旧的元组,因此我们无法删除旧的元组对象,但是由于该旧的元组对象,我们仅使用对x [0]的引用,因此将内存浪费为旧的元组元组对象不能被任何东西访问。

这是真正的内存泄漏情况吗?我们在浪费内存只是为了使新元组对象的引用有意义。

最佳答案

您可能是从C ++之类的语言开始使用Python的,其中变量是值存储在其中的内存位置。在Python中,值存储在您不必担心的地方,并且变量只是引用那些变量的名称。价值观。无法使变量引用另一个变量* —您可以使其与另一个变量引用相同的值,但这不是问题。



例如,在C ++中:

int x[] = {1, 2, 3};
int &y = x[0];


在这里,x是一个足以容纳三个int值的存储位置,而y是对这些位置中第一个的引用。因此,如果在x仍然存在的情况下y消失了,您将有一个悬空的引用,这很不好。但是在Python中:

x = [1, 2, 3]
y = x[0]


在这里,xlist对象的名称,其三个位置是存储在其他位置的三个不同int对象的名称,而y只是第一个int对象的另一个名称。如果x消失了,Python可以释放list,然后释放23对象**(因为没有其他人引用它们),只留下了1对象。



这也是为什么Python中没有“复制构造函数” ***的原因。在C ++中,int z = x[0]创建一个新的内存位置,并将intx[0]隐式复制到该内存位置。在Python中,除非您明确编写类似z = copy.copy(x[0])的文字,否则您永远不会复制任何内容。



*如果您查看封闭单元在幕后的工作方式,则并非如此。

**实际上,小整数通常经过特殊处理,并且可以永久保存,但是我们可以忽略它。

***复制分配运算符,移动构造函数和移动赋值运算符少得多。

关于python - 浪费空间或内存泄漏:Python,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19797687/

10-12 12:20
查看更多