写点什么

软件测试 / 测试开发丨 Python 深拷贝与浅拷贝 学习笔记

作者:测试人
  • 2023-10-08
    北京
  • 本文字数:1786 字

    阅读完需:约 6 分钟

免费领取:测试资料+测试用例+简历模板+测试文档

本文为霍格沃兹测试开发学社学员学习笔记分享

原文链接:https://ceshiren.com/t/topic/27704

深拷贝与浅拷贝

1、什么是拷贝

  • 拷贝是指使用一个已存在一个对象,生成一个新的对象,两个对象在内存中具有独立的存储空间

2、浅拷贝

  • 浅拷贝是指是创建一个新的对象时,只拷贝内容是原始对象的引用,而不是创建原始对象的副本数据

  • 浅拷贝不具有数据独立性,对象的 copy() 方法,copy 模块的 copy() 方法,工厂方法,切片等方式得到的都是浅拷贝对象。

  1. 使用对象的 copy()方法得到浅拷贝对象;

  2. 使用工厂方法获取浅拷贝对象;

  3. 使用切片方式获取浅拷贝对象;

  4. 使用 copy 模块中的 copy 方法获取浅拷贝对象;

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))# 2308221463360print(id(copyData1)) # 2308221465664print(id(copyData2)) # 2308221465792print(id(copyData3)) # 2308221465728print(id(copyData4)) # 2308221468544
# 当修改任意对象时,其它对象都会受影响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']}]
复制代码

3、深拷贝

  • 深拷贝是指创建一个新的对象,并递归地复制原始对象及其所有嵌套对象的内容,而不仅仅是复制它们的引用。

  • 深拷贝具有数据独立性使用 copy 模块中的 deepcopy() 方法实现深拷贝。

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)) # 2623654162624print(id(deepCopyData))# 2623654163392

# 当修改任意对象时,其它对象都不会受影响originData[1]["chars"][1] = "BBB"
# 查看所有对象的数据print(originData) # [[1, 2], {'name': 'Tom', 'chars': ['A', 'BBB']}]print(deepCopyData)# [[1, 2], {'name': 'Tom', 'chars': ['A', 'B']}]
复制代码

4、浅拷贝与深拷贝区别

  • 相同点:内容相同,地址不同:都是重新生成一个新内存地址的数据;

  • 不同点:

1、数据对立性不一样

  • 浅拷贝:不具有数据独立性,当修改任意对象时,其它对象都会受影响;

  • 深拷贝:具有数据独立性,当修改任意对象时,其它对象都不会受影响;

2、实现方式不一样

  • 浅拷贝:

  1. 使用对象的 copy()方法得到浅拷贝对象;

  2. 使用工厂方法获取浅拷贝对象;

  3. 使用切片方式获取浅拷贝对象;

  4. 使用 copy 模块中的 copy 方法获取浅拷贝对象;

  • 深拷贝:使用 copy 模块中的 deepcopy() 方法实现深拷贝;

5、说明:

  • 程序的大部分场景都使用浅拷贝。

  • 浅拷贝,深拷贝特指容器类型保存的复杂结构,对于基本类型的数据,都是引用指向(不在缓存池中的字符串对像除外)。

  • 类似公共排序方法 sorted() 实现就可以使用深拷贝,因为该方法返回一个排序后的新列表,该列表可能在程序其它位置被修改,避免影响原列表,深拷贝更适合。

发布于: 刚刚阅读数: 4
用户头像

测试人

关注

专注于软件测试开发 2022-08-29 加入

霍格沃兹测试开发学社,测试人社区:https://ceshiren.com/t/topic/22284

评论

发布
暂无评论
软件测试/测试开发丨Python深拷贝与浅拷贝 学习笔记_Python_测试人_InfoQ写作社区