Python中深拷贝与浅拷贝的区别介绍
本文详细解析Python中深拷贝与浅拷贝的核心区别。通过对比可变与不可变类型在复制过程中的内存地址变化,结合具体代码示例,说明浅拷贝仅复制顶层对象而深拷贝递归复制子对象的行为差异,帮助开发者避免数据引用错误。
Python包含6种标准数据类型,依据是否可修改可分为两类:不可变类型包括Number(数字)、String(字符串)和Tuple(元组);可变类型包括List(列表)、Dictionary(字典)和Set(集合)。
浅拷贝
执行浅拷贝时,若修改原始对象中可变类型元素的值,拷贝对象也会随之改变;但若修改的是不可变类型元素的值,则不会影响拷贝对象。
代码演示
import copy
#定义一个列表,其中第一个元素是可变类型。
list1 = [[1,2], 'fei', 66];
#进行浅copy
list2 = copy.copy(list1);
#对象地址是否相同。
print(id(list1));
print(id(list2));
#结果:不同
46177816
46177936
#第一个元素地址是否相同。
print(id(list1[0]));
print(id(list2[0]));
#结果:相同
46240432
46240432
#第二个元素地址是否相同。
print(id(list1[1]));
print(id(list2[1]));
#结果:相同
45547328
45547328
#改变第一个值,查看复制对象变化。
list1[0][0] = 2;
print(list2);
#结果:复制对象发生变化
[[2, 2], 'fei', 66]
#改变第二个值,查看复制对象变化。
list1[1] = 'ge';
print(list2);
#结果:复制对象没发生变了
[[2, 2], 'fei', 66]深拷贝
深拷贝不仅复制顶层对象,还会递归复制所有子元素。经过深拷贝后,原始对象与拷贝对象中所有可变元素的内存地址均不相同。
代码演示
import copy
#定义一个列表,其中第一个元素是可变类型。
list1 = [[1,2], 'fei', 66];
#进行深copy
list2 = copy.deepcopy(list1);
#对象地址是否相同。
print(id(list1));
print(id(list2));
#结果:不同
46177816
46177936
#第一个元素地址是否相同。
print(id(list1[0]));
print(id(list2[0]));
#结果:不同
49123856
49588784
#第二个元素地址是否相同。
print(id(list1[1]));
print(id(list2[1]));
#结果:相同
45547328
45547328
#改变第一个值,查看复制对象变化。
list1[0][0] = 2;
print(list2);
#结果:复制对象没发生变了
[[1, 2], 'fei', 66]
#改变第二个值,查看复制对象变化。
list1[1] = 'ge';
print(list2);
#结果:复制对象没发生变了
[[1, 2], 'fei', 66]至此,关于Python中深拷贝与浅拷贝的区别已介绍完毕。希望本文内容能对您的学习有所帮助,欢迎继续支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













