python --深拷贝与浅拷贝

本文介绍了Python中深拷贝和浅拷贝的概念,以及它们在处理非嵌套和嵌套类型数据时的区别。浅拷贝使用copy.copy()函数,创建新对象但共享内存空间,而深拷贝通过copy.deepcopy()函数,创建完全独立的新对象。在处理嵌套列表时,浅拷贝会因修改原始对象的嵌套元素而受影响,而深拷贝则保持独立。
摘要由CSDN通过智能技术生成

深拷贝与浅拷贝简介

  • copy.copy():浅拷贝是创建一个新对象,但是新对象的元素是原对象的引用。也就是说,新对象和原对象共享同一块内存空间。当原对象的元素发生改变时,新对象的元素也会随之改变。
  • copy.deepcopy():深拷贝是创建一个新对象,并且新对象的元素也是新创建的对象,而不是原对象的引用。也就是说,新对象和原对象完全独立,互不影响。当原对象的元素发生改变时,新对象的元素不会受到影响。

对非嵌套类型数据的处理

  • copy
import copy

list1 = [11, 12]
list2 = copy.copy(list1)
print("list1:" + str(id(list1)))  # 140473702684168
print("list2:" + str(id(list2)))  # 140473702685000

list1.append(13)
print("list1:" + str(id(list1)))  # 140473702684168

print(list1)                      # [11, 12, 13]
print(list2)                      # [11, 12]
  • deepcopy
list1 = [11, 12]
list2 = copy.deepcopy(list1)
print("list1:" + str(id(list1)))  # 140687934355592
print("list2:" + str(id(list2)))  # 140473702685000

list1.append(13)
print("list1:" + str(id(list1)))  # 140687934355592

print(list1)                      # [11, 12, 13]
print(list2)                      # [11, 12]

  • 可以得出结论:对于非嵌套列表,深拷贝和浅拷贝的处理结果是一致的,都会创建一个与原始对象完全独立的新对象,修改原始对象或拷贝对象中的任何一个都不会对另一个产生影响,这是因为非嵌套列表中的元素都是基本数据类型,不涉及到嵌套对象的复制。

对嵌套类型数据的处理

  • copy
import copy


list1 = [11, 12, [13, 14]]
list2 = copy.copy(list1)
print("list1:" + str(id(list1)))  # 140175370230216
print("list2:" + str(id(list2)))  # 140175373715336

list1[2].append(15)
print("list1:" + str(id(list1)))  # 140175370230216

print(list1)                      # [11, 12, [13, 14, 15]]
print(list2)                      # [11, 12, [13, 14, 15]]
  • deepcopy
import copy

list1 = [11, 12, [13, 14]]
list2 = copy.deepcopy(list1)
print("list1:" + str(id(list1)))  # 140175373907592
print("list2:" + str(id(list2)))  # 140175370230216

list1[2].append(15)
print("list1:" + str(id(list1)))  # 40175373907592

print(list1)                      # [11, 12, [13, 14, 15]]
print(list2)                      # [11, 12, [13, 14]]
  • 可以得出结论:对于嵌套列表,深拷贝和浅拷贝的处理结果是不同的。浅拷贝只复制了原始列表的引用,所以修改原始列表中的嵌套列表中的对象时,浅拷贝列表也会受到影响。而深拷贝递归地复制了原始列表及其所有嵌套的列表中的对象,所以修改原始列表中的嵌套列表中的对象时,深拷贝列表不受影响。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值