当你在面试中被问到“Python 的深拷贝和浅拷贝有什么区别?”时,是否瞬间大脑一片空白?这个问题不仅频繁出现在技术面试中,也是衡量你对 Python 内存管理和数据操作理解的重要考察点。
那么,什么是深拷贝和浅拷贝?它们究竟有何不同?又该在何种场景中使用?
在当下的开发场景中,无论是数据分析还是 Web 开发,大量数据处理已经成为常态。误用浅拷贝会导致数据被无意修改,引发难以察觉的 BUG。
关于深浅拷贝
在 Python 中,用等号 =
给变量赋值时,并不会真正复制对象,而只是让新的变量指向原来的对象。也就是说,新变量和原来的变量其实是共享同一个对象。如果想要创建一个“真正的副本”,让新对象和原对象互相独立,我们可以使用 Python 的 copy
模块来实现。copy
模块中提供了两种方式:深拷贝及浅拷贝:
深拷贝和浅拷贝的概念用于描述对象的复制方式,它们的主要区别在于是否递归复制对象中的嵌套对象。
浅拷贝:创建一个新对象,只复制原对象的第一层引用,嵌套对象仍然与原对象共享引用。
深拷贝:创建一个完全独立的新对象,递归复制原对象及其嵌套对象的所有内容。
Python深拷贝语法:
copy.deepcopy(x)
Python浅拷贝语法:
copy.copy(x)
为了更加直观了解深拷贝和浅拷贝的区别,这里我们可以通过代码可视化网站python tutor清楚的看到代码执行的每一步发生了什么、变量的作用域和其对应关系都一目了然:
Python Tutor - Python Online Compiler with Visual AI Help
测试验证浅拷贝:
单层数据结构:
- 对于可变类型如列表、字典、集合,浅拷贝会开辟新的空间地址,进行浅拷贝
- 对于不可变类型如数字、字符串、元组,浅拷贝仅仅是地址指向,不会开辟新空间拷贝值
外层对象是可变的,内层对象是不可变的:
外层对象是不可变的,内层对象是可变的:
外层对象是可变的,内层对象是可变的:
外层对象是不可变的,内层对象是不可变的:
浅拷贝总结:
浅拷贝是对一个对象父级(外层)的拷贝,并不会拷贝子级(内部)。使用浅拷贝的时候,分为两种情况:
- 第一种,如果最外层的数据类型是可变的,如列表、字典、集合,浅拷贝会开启新的地址空间去存放。
- 第二种,如果最外层的数据类型是不可变的,如数字、字符串、元组,浅拷贝对象的时候,还是引用原对象的地址空间。
测试验证深拷贝:
单层数据结构:
这里的表现和浅拷贝是一样的
对于外层对象是可变的,内层对象是不可变的:
对于外层对象是不可变的,内层对象是可变的:
外层对象是可变的,内层对象是可变的:
外层对象是不可变的,内层对象是不可变的:
深拷贝总结:
深拷贝对一个对象是所有层次的拷贝(递归),内部和外部都会被拷贝过来。深拷贝也分两种情况:
- 第一种,最外层数据类型可变。外层的会新开辟地址空间存放。如果里面是可变数据类型,内部会新开辟地址空间存放。如果内部数据类型不可变,内部则是对地址的引用。
- 第二种,外层数据类型不可变,如果内部数据是可变数据类型,外部和内部都会新开辟地址空间存放。如果内部数据类型不可变,外部和内部都是对地址的引用。
理解深浅拷贝不仅仅是为了面试,它更是写出健壮、可维护代码的关键一步。尤其在操作复杂对象时,合理运用深浅拷贝能极大提升程序的可靠性。
掌握深浅拷贝,不只是一次技术提升,更是面试中技压群雄的秘密武器!
标签:外层,必问,Python,数据类型,对象,可变,搞懂,拷贝 From: https://blog.csdn.net/m0_58552717/article/details/144161279