python 赋值、浅拷贝、深拷贝的区别
赋值、浅拷贝、深拷贝的区别
前提知识
要想弄请赋值、浅拷贝、深拷贝的区别,首先要知道栈内存和堆内存
堆内存(heap):保存每一个对象的属性内容,堆内存需要用关键字new才可以开辟,如果一个对象没有对应的堆内存指向,将无法使用。
栈内存(stack):保存的是一块堆内存的地址数值,可以把它想象成一个int型变量(每一个int型变量只能存放一个数值),所以每一块栈内存只能保存一块堆内存地址。
由此可知,栈内存中存储的是变量和普通数据类型或者是变量和地址,
堆内存存储的是对象的具体信息

区别判断
所以赋值、浅拷贝、深拷贝的区别主要在于变量的值为对象上,如果变量的值为普通类型,使用不到堆内存,则三者没有区别
赋值
#举例
#赋值拷贝就是将栈内存的值赋值给其他的变量,两个指针都指向原来的堆内存地址
a=[1,2,3,4,5]
b=a
id(a)
id(b) #发现a,b的堆地址相同
#所以a改变时b随之改变
浅拷贝
#浅拷贝只能拷贝一层堆地址
a=[1,2,3,4,[5,6]]
b=a.copy() #浅拷贝
b[4][0]=2
id(a)
id(b)#a,b的第一层堆地址不同,第二层堆地址
#a的第一层对地址对应的值改变,b的第一层值不变,a的第二层堆地址的值改变,b的第二层堆地址值改变
深拷贝
from copy import deepcopy
a=[1,2,3,[4,5]]
b=deepcopy(a)
a[3][1]=2
id(a)
id(b)#a,b的全部堆地址不同
#无论a怎么改变,b都不会改变

浙公网安备 33010602011771号