1. 概念

    普通情况下,复制一个对象是不会新开辟内存空间的,只是把新的对象名称指向原有的内存地址,这种操作其实不是算是拷贝,只是新的引用。把新的对象置于新的内存空间中,才是拷贝。在python中,深浅拷贝的区别实际上是拷贝的深度不同。

  2. 操作

    常见的‘=’号就是一种拷贝方式。python在复制对象时实际上是调用copy模块的copy方法,即copy.copy()。而使用copy.deepcopy()函数操作就是深拷贝。对于字符串和数字来说,不管是深拷贝还是浅拷贝,都只是在原有内存地址上的新引用,所以是没有区别的。可以用id()函数来验证内存地址的异同。

  3. 字典的拷贝

    使用浅拷贝时,会生成一个新字典,而新旧字典的id值不同,但是字典中的键值的id是相同的。也就是说,浅拷贝字典时,只会复制字典的最外一层,而内层仍使用原来的内存位置。

    使用深拷贝时,同样会生成一个新字典,字典的id值不同,字典中的键也会生成新的拷贝,但是字典中的键对应的值的id仍然是相同的。那区别在哪里呢?实际上深浅拷贝的区别在于拷贝的层次不同,浅拷贝只拷贝第一层,而深拷贝会拷贝多层(所有层)。如果字典中还嵌套了列表或者字典,那么这些嵌套的层也会被拷贝。

    那字典中的键的值为什么是原来的呢?这是因为,虽然拷贝了字典,但是字典中的值仍然是对原始值(对象)的引用。这时如果改变新字典的值,那么新的引用就产生了,字典的值也就被改变了(与原始值的id不相同)。

  4. 列表和元组的copy

    与字典的copy相同,深浅拷贝的区别在于拷贝的层次不同。