我有一个关于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])
所以我很困惑。现在我们似乎有两个记忆的地方
列表是对象,因此是“按引用调用”。当您编写
B=A
时,您将得到a后面的对象的引用(c-pointer)(而不是a本身!),所以基本上,正如您的代码已经告诉您的,A is B == True
。引用不在A上,而是在A指向的对象上,因此如果将A更改为A = [5,6]
,解释器将注意到旧列表中有另一个引用(B),并将保留该引用和该列表(否则它将落在垃圾收集器中)。它只会改变存储在A中的地址但是,如果然后重新赋值
B=A
,那么B将是[5,6]
。在第二次将新对象分配给a
你最初的理解是正确的。当你这么做的时候
现在有两个名称指向内存中的同一对象。在
你的误解就是当你这样做的时候
^{pr2}$这不会将
[5, 6]
复制到内存中的那个位置。它分配一个新的列表[5, 6]
,然后更改名称A
来指向这个列表。但是B
仍然指向它之前指向的同一个列表。在基本上,每次
您正在更改
A
指向的位置,而不是更改它指向的对象。在相关问题 更多 >
编程相关推荐