python学习系列--深拷贝和浅拷贝
2017-07-10 00:35
330 查看
概念
普通情况下,复制一个对象是不会新开辟内存空间的,只是把新的对象名称指向原有的内存地址,这种操作其实不是算是拷贝,只是新的引用。把新的对象置于新的内存空间中,才是拷贝。在python中,深浅拷贝的区别实际上是拷贝的深度不同。
操作
常见的‘=’号就是一种拷贝方式。python在复制对象时实际上是调用copy模块的copy方法,即copy.copy()。而使用copy.deepcopy()函数操作就是深拷贝。对于字符串和数字来说,不管是深拷贝还是浅拷贝,都只是在原有内存地址上的新引用,所以是没有区别的。可以用id()函数来验证内存地址的异同。
字典的拷贝
使用浅拷贝时,会生成一个新字典,而新旧字典的id值不同,但是字典中的键值的id是相同的。也就是说,浅拷贝字典时,只会复制字典的最外一层,而内层仍使用原来的内存位置。
使用深拷贝时,同样会生成一个新字典,字典的id值不同,字典中的键也会生成新的拷贝,但是字典中的键对应的值的id仍然是相同的。那区别在哪里呢?实际上深浅拷贝的区别在于拷贝的层次不同,浅拷贝只拷贝第一层,而深拷贝会拷贝多层(所有层)。如果字典中还嵌套了列表或者字典,那么这些嵌套的层也会被拷贝。
那字典中的键的值为什么是原来的呢?这是因为,虽然拷贝了字典,但是字典中的值仍然是对原始值(对象)的引用。这时如果改变新字典的值,那么新的引用就产生了,字典的值也就被改变了(与原始值的id不相同)。
列表和元组的copy
与字典的copy相同,深浅拷贝的区别在于拷贝的层次不同。
普通情况下,复制一个对象是不会新开辟内存空间的,只是把新的对象名称指向原有的内存地址,这种操作其实不是算是拷贝,只是新的引用。把新的对象置于新的内存空间中,才是拷贝。在python中,深浅拷贝的区别实际上是拷贝的深度不同。
操作
常见的‘=’号就是一种拷贝方式。python在复制对象时实际上是调用copy模块的copy方法,即copy.copy()。而使用copy.deepcopy()函数操作就是深拷贝。对于字符串和数字来说,不管是深拷贝还是浅拷贝,都只是在原有内存地址上的新引用,所以是没有区别的。可以用id()函数来验证内存地址的异同。
字典的拷贝
使用浅拷贝时,会生成一个新字典,而新旧字典的id值不同,但是字典中的键值的id是相同的。也就是说,浅拷贝字典时,只会复制字典的最外一层,而内层仍使用原来的内存位置。
使用深拷贝时,同样会生成一个新字典,字典的id值不同,字典中的键也会生成新的拷贝,但是字典中的键对应的值的id仍然是相同的。那区别在哪里呢?实际上深浅拷贝的区别在于拷贝的层次不同,浅拷贝只拷贝第一层,而深拷贝会拷贝多层(所有层)。如果字典中还嵌套了列表或者字典,那么这些嵌套的层也会被拷贝。
那字典中的键的值为什么是原来的呢?这是因为,虽然拷贝了字典,但是字典中的值仍然是对原始值(对象)的引用。这时如果改变新字典的值,那么新的引用就产生了,字典的值也就被改变了(与原始值的id不相同)。
列表和元组的copy
与字典的copy相同,深浅拷贝的区别在于拷贝的层次不同。
相关文章推荐
- python开发学习-day03(set集合、collection系列 、深浅拷贝、函数)
- Python学习系列之Module
- Python学习系列之异常和文件操作
- Python学习基本系列笔记(一)
- python系列学习四——定制数据对象
- python系列学习三 —— 数据处理
- python学习系列之一
- python系列学习七——使用sqlite管理数据
- 初识python 学习笔记系列1
- python基础学习-8(浅拷贝与深拷贝)
- python系列学习六——移动开发
- python库的学习系列之 5.6.1. String Methods
- Python学习笔记【引用VS拷贝】
- Python学习系列
- 初识python 学习笔记系列1
- Python学习系列之Object and Object-Orientation
- python库的学习系列之 13.2. ConfigParser — Configuration file parser
- python libsvm 学习总结系列一
- python系列学习一 —— 列表
- python系列学习——移动开发