09 Python3 的深拷贝与浅拷贝

  • 深、浅拷贝不止 Python 有

不妨从用法上看

  • 保险的做法就是使用 copy.deepcopy
>>> import copy
>>> a = [1, 2, 3, [4, 5, 6]]
>>> b = copy.deepcopy(a)
>>> 
  • 数据只有“一层”的话,使用分片或内置方法 copy()copy.copy 就行
>>> a = [1, 2, 3]
>>> b = a[:]
>>> c = a.copy()
>>> 
>>> import copy
>>> d = copy.copy(a)
>>> 
  • 数据只有“一层”的话,使用工厂函数也行
>>> a = [1, 2, 3]
>>> b = list(a)

补充

  • 复合对象谈深、浅拷贝才有意义
  • 复合对象:包含其他对象的对象,如列表、类实例等

  • 浅拷贝只拷贝第一层元素,故又称“顶层拷贝”
  • 若超过一层,浅拷贝后,“外壳”指向新的空间,其内部的元素仍指向原对象内部的元素
  • 可以认为 Python 能“偷懒”时必“偷懒”,有变化才分配内存
  • copy.deepcopy 也不是万能的,必要的时候可以重写方法

  • 常见的不可变对象,如 str, int, float, complex, bool,可以放心拷贝
  • tuple 有点特殊,虽然是不可变对象,但有层数,所以拷贝时需要注意“深浅”
  • 常见的可变对象,如 list, dict,拷贝时需要注意“深浅”
  • set 有点特殊,虽然是可变对象,但它的元素是可哈希的,也就意味着它里面是不可变对象,所以可以放心拷贝
原文地址:https://www.cnblogs.com/yorkyu/p/10328162.html