这一篇的内容主要是关于python中浅拷贝和深拷贝的原理。博主的其他内容可以在其他专栏中查看,更多内容还在更新中。
 变量赋值的底层逻辑  
变量赋值机制
num1 = [1,2,3]
num2 = num1
num2.append(4)
print("num1:",num1,id(num1))
print("num2:",num2,id(num2))
'''
num1: [1, 2, 3, 4] 2676183109952
num2: [1, 2, 3, 4] 2676183109952
'''
num1把地址复制给了num2。所以num1和num2指向堆内存中的同一个位置。在这种情况下,无论num1还是num2改变都会导致另一个的改变。

浅拷贝
再看看下面这个例子:
num1 = [10,[2,3]]
num2 = num1.copy()

当执行程序后
num1 = [10,[2,3]]
num2 = num1.copy()
num2.append(4)
print("num1:",num1,id(num1))
print("num2:",num2,id(num2))
num1[0] = 8
print("num1[0]:",num1[0],id(num1[0]))
print("num2[0]:",num2[0],id(num2[0]))
print("num1[1]:",num1[1],id(num1[1]))
print("num2[1]:",num2[1],id(num2[1]))
为什么会出现这样的输出结果?

我们再来看下面这个程序的输出结果
num1 = [10,[2,3]]
num2 = num1.copy()
num2[1].append(4)
print(num1)
print(num2)

深拷贝
import copy
num1=[10.[2,3]]
num2=copy.deepcopy(num1)

我们对列表num1,num2做一定的修改
import copy
num1 = [10,[2,3]]
num2 = copy.deepcopy(num1)
print("num1中列表的地址:",id(num1[-1]),"\nnum2中列表的地址:",id(num2[-1]))
print("num2:",num2,id(num2))
print("num1[0]:",num1[0],id(num1[0]))
print("num2[0]:",num2[0],id(num2[0]))
print("num1[1]:",num1[1],id(num1[1]))
print("num2[1]:",num2[1],id(num2[1]))
 总结
浅拷贝:只能copy列表的一级元素,复制了嵌套的可变数据类型的地址 深拷贝:能够copy列表所有层级的元素,复制了嵌套的可变数据类型元

没有合适的画图工具,有些东西没有解释的很清楚,还请见谅。欢迎大家在评论区指正和交流。
|