加载中...

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都不会改变
posted @ 2022-06-28 09:32  最大的敌人是自律  阅读(47)  评论(0)    收藏  举报