Skip to main content
 首页 » 编程设计

python之浪费空间或内存泄漏 : Python

2025年05月04日1552php

我对以下情况感到困惑,也许我的词汇在这里有误,请见谅。

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

由于新元组引用旧元组,我们不能删除旧元组对象,但由于旧元组对象我们只使用对 x[0] 的引用,我们正在浪费内存作为 x[1]任何东西都不能访问旧的元组对象。

这是真正的内存泄漏案例吗?我们是否只是为了新元组对象的引用有意义而浪费内存。

请您参考如下方法:

您可能是从 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] 

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


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


* 如果您了解闭包单元在幕后的工作原理,则情况并非如此。

** 事实上,小整数通常会被特殊对待,并永远保持活力,但让我们忽略这一点。

*** 更少的复制赋值运算符、移动构造函数和移动赋值运算符。