首页 > 其他分享 >26.深拷贝与浅拷贝

26.深拷贝与浅拷贝

时间:2023-11-11 19:33:40浏览次数:25  
标签:26 对象 print 拷贝 copy originData id

什么是拷贝

  • 拷贝是指使用一个已存在一个对象,生成一个新的对象,两个对象在内存中具有独立的存储空间。
  • 浅拷贝是指是创建一个新的对象时,只拷贝内容是原始对象的引用,而不是创建原始对象的副本数据。
  • 深拷贝是指创建一个新的对象,并递归地复制原始对象及其所有嵌套对象的内容,而不仅仅是复制它们的引用。
  • 浅拷贝不具有数据独立性,对象的 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)
print(copyData1)
print(copyData2)
print(copyData3)
print(copyData4)
# 查看所有对象的址,
print(id(originData))
print(id(copyData1))
print(id(copyData2))
print(id(copyData3))
print(id(copyData4))

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

# 查看所有对象的数据
print(originData)
print(copyData1)
print(copyData2)
print(copyData3)
print(copyData4)

深拷贝

import copy

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

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

# 拷贝成功的验证,内容相同,地址不同
# 查看所有对象内容
print(originData)
print(deepCopyData)

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


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

# 查看所有对象的数据
print(originData)
print(deepCopyData)

标签:26,对象,print,拷贝,copy,originData,id
From: https://www.cnblogs.com/csfsz/p/17826228.html

相关文章

  • 326.3的幂
    目录题目法一、迭代法二、递归题目给定一个整数,写一个函数来判断它是否是3 的幂次方。如果是,返回true;否则,返回false。整数n是3的幂次方需满足:存在整数x使得n==3x示例1:输入:n=27输出:true示例2:输入:n=0输出:false示例3:输入:n=9输出:true示......
  • js实现深拷贝
    functiondeepClone(obj,hash=newWeakMap()){if(obj===null)returnobj//如果是null或者undefined我就不进行拷贝操作if(objinstanceofDate)returnnewDate(obj)if(objinstanceofRegExp)returnnewRegExp(obj)//可能是对象或者普通的值如果是......
  • 腾讯云V265/TXAV1直播场景下的编码优化和应用
     //  编者按:随着视频直播不断向着超高清、低延时、高码率的方向发展,AppleVision的出现又进一步拓展了对3D,8K120FPS的视频编码需求,视频的编码优化也变得越来越具有挑战性。LiveVideoStackCon2023上海站邀请到腾讯云的姜骜杰老师分享腾讯云V265/TXAV1直播场景下的编码优化......
  • 编译Fastdfs报错——In file included from ../common/fdfs_global.c:21:0: ../common
    记录一下安装fastdfs时编译报错,报错信息如下:原因:这是因为我们在安装较新版得fastdfs时,从github下载得安装包缺少文件,如果按照网上很多博主较早之前写的文档操作得话就会出现这样得错误,缺少了libserverframe网络框架解决方法:安装 libserverframe网络框架安装包下载地......
  • 7--26. 删除有序数组中的重复项
    第一次提交,两个测试用例都通过了,最后提交结果显示为【超出时间限制】,不通过的测试用例为nums=[1,1]于是,改加了if判断语句但还是提交结果显示【超出时间限制】,不通过的测试用例为nums=[1,2,2]卒!!!!!!classSolution{publicintremoveDuplicates(int[]nums){......
  • Educational Codeforces Round 126 (Rated for Div. 2)
    https://codeforces.com/contest/1661/B题数据很小,直接bfs预处理就行C题随便猜了一下,设mx=\(max\{a_i\}\)最后的值应该是mx,mx+1,mx+2,mx+3之类的吧D题刚开始从前面考虑,陷入僵局,一度非常的困,学习凯库勒睡了一会,就突然想到了,前面不行,就从后面考虑,可以发现,从后面考虑的话,就非常......
  • 牛客[编程题] HJ26 字符串排序
    HJ26 字符串排序  中等  通过率:39.52%  时间限制:1秒  空间限制:32M 描述编写一个程序,将输入字符串中的字符按如下规则排序。规则1:英文字母从A到Z排列,不区分大小写。如,输入:Type输出:epTy规则2:同一个英文字母的大小写同时存在时,按照输入......
  • 2023NOIP A层联测26 总结
    2023NOIPA层联测26总结题目T1origen大意\(n,a_i\leq2\times10^5\)赛时思路一开始想固定一个端点递推去求贡献,发现异或加上平方维护不了递推式,痛失40min。后面多的时间分给T1后接着想做法,考虑拆平方化代数式,然后平方项的因式分解忘了,导致后面一直认为平方项会被加多......
  • 2023NOIP A层联测26 T4 abstract
    2023NOIPA层联测26T4abstract乱证明求性质的光速幂优化题。思路对于每一个节点,到该节点的子树内的叶子节点的路径中(包括路径上的点),出现的值只有\(k\times(\logV+\logV)\)个。那么在以该点为终点,以子树内节点为起点的路径中,取值只有\(k\times(\logV+\logV)\)。这是......
  • 2023NOIP A层联测26 T2 competition
    2023NOIPA层联测26T2competitiontjm的做法,很抽象。考场思路考虑每道题被做过多少次肯定不现实,那么考虑每一道题有多少次没有做出来。假设某一次可以做出来题\(x\)的人是\(i\),而\(i\)下一个人可以做出这道题的人是\(j\),于是题\(x\)有\(C_{j-i}^2\)次不会被做出来......