深拷贝(deepcopy)与浅拷贝(copy)的区别_deepcopy和copy的区别-程序员宅基地

技术标签: python  Python  

1.深拷贝与浅拷贝

  • 直接赋值:其实就是对象的引用(别名)。
  • 浅拷贝(copy):是对于一个对象的顶层拷贝,拷贝父对象,不会拷贝对象的内部的子对象。
  • 深拷贝(deepcopy): 是对于一个对象所有层次的拷贝(递归),完全拷贝了父对象及其子对象。

对象的引用(内存地址)”赋值给变量的,在python中有6个标准数据类型,他们分为可变和不可变两类。

  • 不可变类型:Number(数字)String(字符串)Tuple(元组)
  • 可变类型:List(列表)Dictionary(字典)Set(集合)

浅拷贝(copy)

1.浅拷贝会创建一个新的容器对象(compound object)

2.对于对象中的元素,浅拷贝就只会使用原始元素的引用(内存地址)

常见的浅拷贝操作有:

  • 使用切片操作[:]
  • 使用工厂函数(如list/dict/set)
  • copy模块的copy()方法

注意点:

  1. copy.copy对于不可变类型,不会拷贝,仅仅是指向内存地址.
>>> a="1234567"
>>> b=a
>>> id(a)
4367619440
>>> id(b)
4367619440
>>> c=copy.copy(a)
>>> id(c)
4367619440
>>> d=copy.deepcopy(a)
>>> id(d)
4367619440

  1. copy.copy对于可变类型会进行浅拷贝,生成新的内存地址,但会出现以下两种场景:

1>拷贝对象中无可变类型元素,原对象的元素值改变不影响新对象的元素值.

2>拷贝对象中存在可变类型元素A(例如列表中的子元素是一个字典),拷贝时新对象中可变类型元素A,两者指向同一个内存地址,如果拷贝对象A的值改变,新对象A也会跟着改变.

>>> import copy
>>> list1=[1,2,['a','b']]
>>> list2=list1
>>> list3=copy.copy(list2)
>>> list4=copy.deepcopy(list3)
>>> id(list1)
4338414656
>>> id(list2)
4338414656
>>> id(list3)
4338415016
>>> id(list4)
4338414368
>>> list1[2].append('a')
>>> id(list1)
4338414656
>>> print list1
[1, 2, ['a', 'b', 'a']]
>>> print list3
[1, 2, ['a', 'b', 'a']]
>>> print list4
[1, 2, ['a', 'b']]
>>> list1.append(33)
>>> id(list1)
4338414656
>>> id(list3)
4338415016
>>> print list1
[1, 2, ['a', 'b', 'a'], 33]
>>> print list3
[1, 2, ['a', 'b', 'a']]

深拷贝(deepcopy)

1.深拷贝和浅拷贝一样,都会创建一个新的容器对象(compound object)

2.和浅拷贝的不同点在于,深拷贝对于对象中的元素,深拷贝都会重新生成一个新的对象

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/peng78585/article/details/125574564

智能推荐

Vue.js的开发流程_创建了vue.js项目 怎么编写-程序员宅基地

文章浏览阅读6.7k次,点赞4次,收藏22次。简单快速了解Vue.js的开发流程 Vue.js作为目前最热门最具前景的前端框架之一,其提供了一种帮助我们快速构建并开发前端项目的新的思维模式。本文主要介绍 vue.js的开发流程,不会涉及知识点的具体代码,点到为止。了解Vue.js的开发流程,并进一步理解如何通过Vue.js来构建一个中大型的前端项目,同时做好相应的部署与优化工作。Vue.js简介_创建了vue.js项目 怎么编写

物联网对各行业的影响,一定要看!_物联网在汉语言专业中的应用-程序员宅基地

文章浏览阅读1.4k次。现在,物联网正以多种创造性方式影响着各行各业。它不仅是连接到互联网上的计算机,还开辟了一个充满机遇的世界,包括农业用途、能源工业和金融规划等。最初,物联网是一些连接到全球互联网的计算机。但现在,从手机到手表、电表、监控摄像头、工业生产设备等一切设备都连接到了互联网,影响了人们的生活方式和工业组织的运作方式。这种物理对象网络(大多数最初不是为互联网连接而创建的)称为物联网(IoT)。如今,嵌入..._物联网在汉语言专业中的应用

javascript 使用ocx-程序员宅基地

文章浏览阅读129次。[b]1.找出相关信息,主要是classid [/b]首先我们的给这个ocx起个名字,起什么名字通过最后生成的ocx控件的文件名决定。 第二,我们的找到这个ocx的编号值,将ocx提取出来,我采用Microsoft Control Pad来编辑,得到ocx控件的classid, 然后我们做下面的工作。 由于我的ocx不是自己编辑的,所以我是等注册后去注册表里找,直接复制文件名,然后..._javascrpit 赋值 ocx param

java中的volatile关键字的功能详解_volatile 关键字,-程序员宅基地

文章浏览阅读4.6k次。Cookie的应用场景:1,记录用户的登陆状态,提示用户是否记住密码;2,购物车购物功能;我们知道,在web开发过程中,我们都要和cookie打交道,有时候离开了cookie还真玩不转。cookie最典型的应用莫过于登陆提示,最近在做一个小项目,正好要用到cookie的知识,在这里顺便做一下总结。_volatile 关键字,

通过 ICMP 协议实现 Ping Tunnel 建立可穿透网络隧道-程序员宅基地

文章浏览阅读7.1k次。Twitter via Ping Tunnel周四 Cola 没去幼儿园,中午带着他去 KFC 吃东西。回来的时候小林指着西总布胡同说走这条路回去还是原路返回,他说还是..._ping tunnel

基于springboot+vue.js的名城小区物业管理系统(附带文章和源代码设计说明文档ppt)-程序员宅基地

文章浏览阅读817次,点赞18次,收藏20次。博主介绍:CSDN深耕的技术专家、博客专家、有着常年的工作经验、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战文末获取源码+数据库。

随便推点

CentOS 6.5的安装详解(图文详解)-程序员宅基地

文章浏览阅读415次。第一步 点击"Install or upgrade an existing system"第二步 磁盘硬件检测界面,一般都正常,不需检测,选择"skip",没必要在这一步浪费几分钟时间第三步发现当地安装媒介界面,Enter第四步进入CentOS6.5引导界面,点击“Next”第五步安装语言选择界面,最好是选择"English(English)",点击“N...

MFC深入浅出-CObject类_cobjectlist mfc-程序员宅基地

文章浏览阅读207次。CObject类 CObject 是大多数MFC类的根类或基类。CObject类有很多有用的特性:对运行时类信息的支持,对动态创建的支持,对串行化的支持,对象诊断输出,等等。MFC从CObject派生出许多类,具备其中的一个或者多个特性。程序员也可以从CObject类派生出自己的类,利用CObject类的这些特性。 本章将讨论 MFC如何设计CObject类的这些特性。首先,..._cobjectlist mfc

jenkins项目构建类型 -----Pipeline流水线项目构建_jenkins中使用jenkins pipline构建npm项目配置步骤-程序员宅基地

文章浏览阅读2.4k次。学习笔记_jenkins中使用jenkins pipline构建npm项目配置步骤

JFrame的使用方法-程序员宅基地

文章浏览阅读2.3w次,点赞38次,收藏245次。JFrame的使用方法JFram是一个GUI的最顶级容器,基本上所有的GUI的组件都在其上面使用。使用方法1.创建一个JFrame对象JFrame jf = new JFrame("我是标题鸭!!!");当然标题的设置也可以使用setTitle();jf.setTitle("我是标题鸭!!!");2.设置窗体的大小和位置在默认情况下,窗体出现在屏幕的最左上角jf.setS..._jfram

机器学习实战 | 自动化特征工程工具Featuretools应用-程序员宅基地

文章浏览阅读1.3w次,点赞7次,收藏70次。本篇讲解使用自动化特征工程工具Featuretools,对数据进行自动化特征工程的方法,并借助于BigMart Sales数据集来演示自动化特征工程的相关应用。_featuretools

eNSP 常用指令_stp region configuration-程序员宅基地

文章浏览阅读4.2k次,点赞21次,收藏80次。作为菜鸟记录下学习eNSP的笔记按照学校讲课进度记录,以网络学习的指令进行补充分类指令进入退出保存system-view 进入配置模式ctrl+z /quit 退出端口配置模式save 保存当前配置记得选Y命名和改名sysname SWC 给设备命名sys name j..._stp region configuration

推荐文章

热门文章

相关标签