变量和分配给它们的内存?

2024-06-13 06:08:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个关于Python处理复制变量的内存的问题。在

例如,我有一个list(或string,tuple,dictionary,set)变量

A = [1,2,3]

然后我把A的值赋给另一个变量B

^{pr2}$

如果我对A做“一些改变”,例如

A.pop(0)

然后B也会改变,即。, 打印(A,B)会给我([2,3],[2,3])

我读了一些材料,他们说“B=A没有把A的值复制到一个新的位置,它只是让B这个名字指向了A在内存中的同一个位置。”我能把这个解释为我们仍然只有一个记忆位置,但现在它有两个名字吗?在

但是,我发现如果我对A做一些其他的更改,例如

A = [5,6]  # I reassign A value, 

然后我发现 打印(A,B) 给我([5,6],[1,2,3])

所以我很困惑。现在我们似乎有两个记忆的地方


Tags: 记忆内存stringdictionaryvalue地方名字pop
3条回答

列表是对象,因此是“按引用调用”。当您编写B=A时,您将得到a后面的对象的引用(c-pointer)(而不是a本身!),所以基本上,正如您的代码已经告诉您的,A is B == True。引用不在A上,而是在A指向的对象上,因此如果将A更改为A = [5,6],解释器将注意到旧列表中有另一个引用(B),并将保留该引用和该列表(否则它将落在垃圾收集器中)。它只会改变存储在A中的地址

但是,如果然后重新赋值B=A,那么B将是[5,6]。在

第二次将新对象分配给a

>>> 
>>> a= [1,2,3]
>>> id(a)
4353139632
>>> b = a
>>> id(b)
4353139632
>>> a= [4,5]
>>> id(a)
4353139776
>>> id(b)
4353139632

你最初的理解是正确的。当你这么做的时候

B = A

现在有两个名称指向内存中的同一对象。在

你的误解就是当你这样做的时候

^{pr2}$

这不会将[5, 6]复制到内存中的那个位置。它分配一个新的列表[5, 6],然后更改名称A来指向这个列表。但是B仍然指向它之前指向的同一个列表。在

基本上,每次

A = <something>

您正在更改A指向的位置,而不是更改它指向的对象。在

相关问题 更多 >