-
概念
普通情况下,复制一个对象是不会新开辟内存空间的,只是把新的对象名称指向原有的内存地址,这种操作其实不是算是拷贝,只是新的引用。把新的对象置于新的内存空间中,才是拷贝。在python中,深浅拷贝的区别实际上是拷贝的深度不同。
-
操作
常见的‘=’号就是一种拷贝方式。python在复制对象时实际上是调用copy模块的copy方法,即copy.copy()。而使用copy.deepcopy()函数操作就是深拷贝。对于字符串和数字来说,不管是深拷贝还是浅拷贝,都只是在原有内存地址上的新引用,所以是没有区别的。可以用id()函数来验证内存地址的异同。
-
字典的拷贝
使用浅拷贝时,会生成一个新字典,而新旧字典的id值不同,但是字典中的键值的id是相同的。也就是说,浅拷贝字典时,只会复制字典的最外一层,而内层仍使用原来的内存位置。
使用深拷贝时,同样会生成一个新字典,字典的id值不同,字典中的键也会生成新的拷贝,但是字典中的键对应的值的id仍然是相同的。那区别在哪里呢?实际上深浅拷贝的区别在于拷贝的层次不同,浅拷贝只拷贝第一层,而深拷贝会拷贝多层(所有层)。如果字典中还嵌套了列表或者字典,那么这些嵌套的层也会被拷贝。
那字典中的键的值为什么是原来的呢?这是因为,虽然拷贝了字典,但是字典中的值仍然是对原始值(对象)的引用。这时如果改变新字典的值,那么新的引用就产生了,字典的值也就被改变了(与原始值的id不相同)。
-
列表和元组的copy
与字典的copy相同,深浅拷贝的区别在于拷贝的层次不同。
本文转自 拾瓦兴阁 51CTO博客,原文链接:http://blog.51cto.com/ponyjia/1945738