我对以下情况感到困惑,也许我的词汇在这里是错误的,所以道歉.
假设我们有一个元组,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];
Run Code Online (Sandbox Code Playgroud)
这里x是一个足以容纳三个int值的内存位置,并且y是对这些位置中的第一个的引用.所以,如果x在y活着的时候离开,你会有一个悬挂的参考,这将是不好的.但是在Python中:
x = [1, 2, 3]
y = x[0]
Run Code Online (Sandbox Code Playgroud)
这里x是一个list对象的名称,其三个位置是int存储在别处的三个不同对象的名称,并且y只是第一个int对象的另一个名称.如果x消失了,Python可以腾出list后,它可以腾出2和3对象**(因为没有人提到他们),只留下1对象后面.
这也是Python中没有"复制构造函数"***的原因.在C++中,int z = x[0]创建一个新的内存位置,并隐式地将intfrom 复制x[0]到该内存位置; 在Python中,除非你明确写出类似的东西,否则你z = copy.copy(x[0])永远不会复制任何东西.
*如果你看看封闭细胞如何在封面下工作,这是不正确的.
**事实上,小整数通常是专门处理的,并且永远保持活着,但让我们忽略它.
***更少的复制赋值运算符,移动构造函数和移动赋值运算符.