一、基本概念
1、深拷贝和浅拷贝
1)深拷贝和浅拷贝概念
1.深拷贝,拷贝的程度深,自己新开辟了一块内存,将被拷贝内容全部拷贝过来了;
2.浅拷贝,拷贝的程度浅,只拷贝原数据的首地址,然后通过原数据的首地址,去获取内容。
两者的优缺点对比:
(1)深拷贝拷贝程度高,将原数据复制到新的内存空间中。改变拷贝后的内容不影响原数据内容。但是深拷贝耗时长,且占用内存空间。
(2)浅拷贝拷贝程度低,只复制原数据的首地址。其实是将副本的地址指向原数据地址。修改副本内容,是通过当前地址指向原数据地址,去修改。所以修改副本内容会影响到原数据内容。但是浅拷贝耗时短,占用内存空间少。
(3)相比于浅拷贝,b= a这种直接指向a的首地址,a和b完全一样。
import copy
a = [1,2,3,[4,5]]
b = a
c = a[:]
d = a.copy()
e = copy.deepcopy(a)


结合上面两图,得出结论:
1)b=a为直接指向a的地址,a和b完全一样
2)c = a[:]等同于浅copy,只指向a的首地址,copy出来的是a的首地址,后面的地址指向一样,这样看首地址的元素互不影响,非首地址的元素公用存储空间,会收到影响
3)d为深copy,完全复制元素和指针,开辟自己的新的内存空间,a与d之间的任何操作互不影响
可视化python在线编程平台:
Python Tutor code visualizer: Visualize code in Python, JavaScript, C, C++, and Java
2)对比JAVA:
在Java中基本数据类型数据直接存储在栈(stack)中,引用数据类型数据存储的是该对象在栈中引用,真实的数据存放在堆内存里,引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。
文章详细阐述了深拷贝和浅拷贝的概念,深拷贝创建了对象的新副本,不共享内存,而浅拷贝仅复制首地址,导致修改副本可能影响原数据。在Python中,`b=a`是浅拷贝,`c=a[:]`和`d=a.copy()`是浅拷贝,`e=copy.deepcopy(a)`是深拷贝。而在Java中,基本数据类型直接存储在栈中,引用数据类型存储其在堆中的引用,指向实际数据的地址。
6445

被折叠的 条评论
为什么被折叠?



