一、基本概念
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)中,引用数据类型数据存储的是该对象在栈中引用,真实的数据存放在堆内存里,引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。