什么是深拷贝,什么是浅拷贝,如何使用

什么是深拷贝和浅拷贝

* 浅拷贝和深拷贝是两种不同的拷贝方式。

浅拷贝

* 对于不可变数据类型像元组、字符串、数字,浅拷贝只是地址指向,不会开辟新的内存地址
* 对于可变数据类型像列表、字典、集合,浅拷贝开辟新的内存地址(仅仅是最顶层开辟了新的空间,里层的元素地址还是一样的),进行浅拷贝
* 浅拷贝只会复制一层,如果copy的对象中有可变数据类型,修改可变数据类型还会影响拷贝的对象

如何实现浅拷贝

* 使用数据类型本身的构造器:
    比如列表使用list()、集合使用set()、字典使用dict();
* 列表还可以通过切片操作符‘:’实现浅拷贝
* 使用 copy.copy() 函数,适用所有数据类型
* 字符串str()和元组tuple() 或者切片操作符 ‘:’ 不会创建一份浅拷贝,相反它会返回一个指向相同元组的引用

深拷贝

* 对于不可变类型像元组、字符串、数字,深拷贝跟浅拷贝一样只是地址指向,不会开辟新的内存地址
* 对于可变数据类型深拷贝是完全复制,也就是除了顶层拷贝,还对子元素也进行了拷贝(本质上递归浅拷贝),经过深拷贝后,原始对象和拷贝对象所有的元素地址都没有相同的了,所以修改原始对象的时候,拷贝对象不会被影响。

如何实现深拷贝

* 使用copy.deepcopy()

如何使用

浅拷贝示例

  import copy

  # 原对象
  original_list = [1, 2, [3, 4]]
  # 使用浅拷贝创建拷贝对象
  copied_list = copy.copy(original_list)

  # 修改原对象中的可变数据类型
  original_list[2].append(5)

  print("原对象:", original_list)  # 原对象: [1, 2, [3, 4, 5]]
  print("拷贝对象:", copied_list)  # 拷贝对象: [1, 2, [3, 4, 5]]

深拷贝示例

  import copy

  # 原对象
  original_list = [1, 2, [3, 4]]
  # 使用深拷贝创建拷贝对象
  copied_list = copy.deepcopy(original_list)

  # 修改原对象中的可变数据类型
  original_list[2].append(5)

  print("原对象:", original_list)   # 原对象: [1, 2, [3, 4, 5]]
  print("拷贝对象:", copied_list)   # 拷贝对象: [1, 2, [3, 4]]

图片理解

posted @ 2023-11-21 15:34  5233xin  阅读(127)  评论(0)    收藏  举报