python学习 -- 深拷贝与浅拷贝

什么是拷贝:

  • 拷贝是指使用一个已存在一个对象,生成一个新的对象,两个对象在内存中具有独立的存储空间。
  • 浅拷贝是指是创建一个新的对象时,只拷贝内容是原始对象的引用,而不是创建原始对象的副本数据。
  • 深拷贝是指创建一个新的对象,并递归地复制原始对象及其所有嵌套对象的内容,而不仅仅是复制它们的引用。
  • 浅拷贝不具有数据独立性,对象的 copy() 方法,copy 模块的copy() 方法,工厂方法,切片等方式得到的都是浅拷贝对象。
  • 深拷贝具有数据独立性,使用 copy 模块中的 deepcopy() 方法实现深拷贝。
  • 程序的大部分场景都使用浅拷贝。
  • 浅拷贝,深拷贝特指容器类型保存的复杂结构,对于基本类型的数据,都是引用指向(不在缓存池中的字符串对像除外)。
  • 类似公共排序方法 sorted() 实现就可以使用深拷贝,因为该方法返回一个排序后的新列表,该列表可能在程序其它位置被修改,避免影响原列表,深拷贝更适合。

浅拷贝:

import copy

# 原始数据
originData = [[1,2],{"name":"Tom", "chars":["A","B"]}]

# 使用对象的copy()方法得到浅拷贝对象
copyData1 = originData.copy()
# 使用工厂方法获取浅拷贝对象
copyData2 = list(originData)
# 使用切片方式获取浅拷贝对象
copyData3 = originData[:]
# 使用 copy模块中的copy方法获取浅拷贝对象
copyData4 = copy.copy(originData)

# 拷贝成功的验证,内容相同,地址不同
# 查看所有对象内容
print(originData)  # [[1, 2], {'name': 'Tom', 'chars': ['A', 'B']}]
print(copyData1)  # [[1, 2], {'name': 'Tom', 'chars': ['A', 'B']}]
print(copyData2)  # [[1, 2], {'name': 'Tom', 'chars': ['A', 'B']}]
print(copyData3)  # [[1, 2], {'name': 'Tom', 'chars': ['A', 'B']}]
print(copyData4)  # [[1, 2], {'name': 'Tom', 'chars': ['A', 'B']}]
# 查看所有对象的址,
print(id(originData))  # 4552798720
print(id(copyData1))  # 4552768128
print(id(copyData2))  # 4552765952
print(id(copyData3))  # 4552887872
print(id(copyData4))  # 4552888256

# 当修改任意对象时,其它对象都会受影响
copyData3[1]["chars"][1] = "BBB"

# 查看所有对象的数据
print(originData)  # [[1, 2], {'name': 'Tom', 'chars': ['A', 'BBB']}]
print(copyData1)  # [[1, 2], {'name': 'Tom', 'chars': ['A', 'BBB']}]
print(copyData2)  # [[1, 2], {'name': 'Tom', 'chars': ['A', 'BBB']}]
print(copyData3)  # [[1, 2], {'name': 'Tom', 'chars': ['A', 'BBB']}]
print(copyData4)  # [[1, 2], {'name': 'Tom', 'chars': ['A', 'BBB']}]

深拷贝:

import copy

# 原始数据
originData = [[1,2],{"name":"Tom", "chars":["A","B"]}]

# 使用 copy模块中的deepcopy方法获取深拷贝对象
deepCopyData = copy.deepcopy(originData)

# 拷贝成功的验证,内容相同,地址不同
# 查看所有对象内容
print(originData)  # [[1, 2], {'name': 'Tom', 'chars': ['A', 'B']}]
print(deepCopyData)  # [[1, 2], {'name': 'Tom', 'chars': ['A', 'B']}]

# 查看所有对象的址,
print(id(originData))  # 4302975424
print(id(deepCopyData))  # 4302946880


# 当修改任意对象时,其它对象都不会受影响
originData[1]["chars"][1] = "BBB"

# 查看所有对象的数据
print(originData)  # [[1, 2], {'name': 'Tom', 'chars': ['A', 'BBB']}]
print(deepCopyData)  # [[1, 2], {'name': 'Tom', 'chars': ['A', 'B']}]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值