图解Python中深浅copy(通俗易懂)
一、深浅copy
赋值运算
l1 = [1, 2, 3, [22, 33]] l2 = l1 l1.append(666) print(l1) # [1, 2, 3, [22, 33], 666] print(l2) # [1, 2, 3, [22, 33], 666]
图解:
注意:l2 = l1
是一个指向,是赋值,和深浅copy无关。
浅copy
其实列表是一个一个的槽位,每个槽位存储的是该对象的内存地址
例1. 给大列表添加元素 l1 = [1, 2, 3, [22, 33]] l2 = l1.copy() # 或者下面这种方式,也是浅copy # import copy # l2 = copy.copy(l1) l1.append(666) print(l1) # [1, 2, 3, [22, 33], 666] print(l2) # [1, 2, 3, [22, 33]] 例2. 给小列表添加元素 l1 = [1, 2, 3, [22, 33]] l2 = l1.copy() l1[-1].append(666) print(l1) # [1, 2, 3, [22, 33, 666]] print(l2) # [1, 2, 3, [22, 33, 666]]、 例3. 将l1列表中第一个元素改为6 l1 = [1, 2, 3, [22, 33]] l2 = l1.copy() l1[0] = 6 print(l1) # [6, 2, 3, [22, 33]] print(l2) # [1, 2, 3, [22, 33]]
图解:
例1
例2
例3
总结:
浅copy:会在内存中新开辟一个空间,存放这个copy的列表,但是列表里面的内容还是沿用之前对象的内存地址。
注意:
切片中,如果是全切,属于浅copy。
深copy
import copy l1 = [1, 2, 3, [22, 33]] l2 = copy.deepcopy(l1) l1.append(666) print(l1) # [1, 2, 3, [22, 33], 666] print(l2) # [1, 2, 3, [22, 33]]
图解:
本质如下图:
但是python对深copy做了一个优化,将可变的数据类型在内存中重新创建一份,而不可变的数据类型则沿用之前的,所以内存中是下面这样的:
总结:
深copy:会在内存中开辟新空间,将原列表以及列表里面的可变数据类型重新创建一份,不可变数据类型则沿用之前的。
到此这篇关于图解Python中深浅copy(通俗易懂)的文章就介绍到这了,更多相关Python 深浅拷贝内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
相关推荐
-
Python对象的深拷贝和浅拷贝详解
本文内容是在<Python核心编程2>上看到的,感觉很有用便写出来,给大家参考参考! 浅拷贝 首先我们使用两种方式来拷贝对象,一种是切片,另外一种是工厂方法.然后使用id函数来看看它们的标示符 复制代码 代码如下: # encoding=UTF-8 obj = ['name',['age',18]] a=obj[:] b=list(obj) for x in obj,a,b: print id(x) 35217032 35227912 29943304 他们的id都不同,按照正
-
Python浅拷贝与深拷贝用法实例
本文实例讲述了Python浅拷贝与深拷贝用法.分享给大家供大家参考.具体分析如下: >>> person=['name',['savings',100]] >>> hubby=person[:] >>> wifey=list(person) >>> [id(x) for x in person,hubby,wifey] [3074051788L, 3074061740L, 3074061996L] >>> [id(y
-
详解Python核心编程中的浅拷贝与深拷贝
一.问题引出浅拷贝 首先看下面代码的执行情况: a = [1, 2, 3] print('a = %s' % a) # a = [1, 2, 3] b = a print('b = %s' % b) # b = [1, 2, 3] a.append(4) # 对a进行修改 print('a = %s' % a) # a = [1, 2, 3, 4] print('b = %s' % b) # b = [1, 2, 3, 4] b.append(5) # 对b进行修改 print('a = %s'
-
Python中的深拷贝和浅拷贝详解
要说清楚Python中的深浅拷贝,需要搞清楚下面一系列概念: 变量-引用-对象(可变对象,不可变对象)-切片-拷贝(浅拷贝,深拷贝) [变量-对象-引用] 在Python中一切都是对象,比如说:3, 3.14, 'Hello', [1,2,3,4],{'a':1}...... 甚至连type其本身都是对象,type对象 Python中变量与C/C++/Java中不同,它是指对象的引用,Python是动态类型,程序运行时候,会根据对象的类型 来确认变量到底是什么类型. 单独赋值: 比如说: 复制代
-
深入浅析Python中list的复制及深拷贝与浅拷贝
在Python中,经常要对一个list进行复制.对于复制,自然的就有深拷贝与浅拷贝问题.深拷贝与浅拷贝的区别在于,当从原本的list复制出新的list之后,修改其中的任意一个是否会对另一个造成影响,即这两个list在内存中是否储存在同一个区域,这也是区分深拷贝与浅拷贝的重要依据.接下来我们就针对Python中list复制的几种方法,来探究一下其是属于深拷贝还是浅拷贝.弄清楚这个问题,有助于我们在编程中规避错误,减少不必要的调试时间. 一.非拷贝方法--直接赋值 如果用=直接赋值,是非拷贝方法.这
-
Python的赋值、深拷贝与浅拷贝的区别详解
在python中,给一个对象赋值,实际上就是对象对内存空间存储的值的引用.当我们把对象赋值给另一个变量的时候,这个变量并没有拷贝这个对象,而只是拷贝了这个对象的引用而已. 一般情况下我们会通过三种方法来实现拷贝对象的引用. Python直接赋值 直接赋值,默认浅拷贝传递对象的引用而已,原始列表改变,被赋值的变量也会做相同的改变.其实就是对'对象'的引用 示例: >>> list_demo = [2, 4, 6] >>> a = list_demo >>>
-
对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解
对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解 列表赋值: >>> a = [1, 2, 3] >>> b = a >>> print b [1, 2, 3] >>> a[0] = 0 >>> print b [0, 2, 3] 解释:[1, 2, 3]被视作一个对象,a,b均为这个对象的引用,因此,改变a[0],b也随之改变 如果希望b不改变,可以用到切片 >>> b = a[:] &
-
深入理解python中的浅拷贝和深拷贝
在讲什么是深浅拷贝之前,我们先来看这样一个现象: a = ['scolia', 123, [], ] b = a[:] b[2].append(666) print a print b 为什么我只对b进行修改,却影响到了a呢?看过我在之前的文章中就说过:序列中保存的都是内存的引用. 所以,当我们通过b去修改里面的空列表的时候,其实就是修改内存中的同一个对象,所以会影响到a. a = ['scolia', 123, [], ] b = a[:] print id(a), id(a[0]), id(
-
Python中字典的浅拷贝与深拷贝用法实例分析
本文实例讲述了Python中字典的浅拷贝与深拷贝用法.分享给大家供大家参考,具体如下: 最近发现的一个很值得记录的东西就是python字典的浅拷贝问题 首先,明确一下什么是浅拷贝,什么是深拷贝: 简单的来说就是,在有指针的情况下,浅拷贝只是增加了一个指针指向已经存在的内存,而深拷贝就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存 也就是说,在浅拷贝情况下,不同引用指向的是同一块内存,改其中一个引用,那么其他引用也会跟着改变 应用到python 的字典复制过程: # codi
-
Python中的赋值、浅拷贝、深拷贝介绍
和很多语言一样,Python中也分为简单赋值.浅拷贝.深拷贝这几种"拷贝"方式. 在学习过程中,一开始对浅拷贝理解很模糊.不过经过一系列的实验后,我发现对这三者的概念有了进一步的了解. 一.赋值 赋值算是这三种操作中最常见的了,我们通过一些例子来分析下赋值操作: str例 复制代码 代码如下: >>> a = 'hello' >>> b = 'hello' >>> c = a >>> [id(x) for x in
-
Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)
1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象.2. copy.deepcopy 深拷贝 拷贝对象及其子对象一个很好的例子: Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->import copya = [1, 2, 3, 4, ['a', 'b']] #原始对象b = a #赋值,传对象的引用c = copy.c
-
浅谈Python浅拷贝、深拷贝及引用机制
这礼拜碰到一些问题,然后意识到基础知识一段时间没巩固的话,还是有遗忘的部分,还是需要温习,这里做份笔记,记录一下 前续 先简单描述下碰到的题目,要求是写出2个print的结果 可以看到,a指向了一个列表list对象,在Python中,这样的赋值语句,其实内部含义是指a指向这个list所在内存地址,可以看作类似指针的概念. 而b,注意,他是把a对象包裹进一个list,并且乘以5,所以b的样子应该是一个大list,里面元素都是a 而当a对象进行了append操作后,其实,隐含的意思是,内存中的这个l
-
详解Python列表赋值复制深拷贝及5种浅拷贝
概述 在列表复制这个问题,看似简单的复制却有着许多的学问,尤其是对新手来说,理所当然的事情却并不如意,比如列表的赋值.复制.浅拷贝.深拷贝等绕口的名词到底有什么区别和作用呢? 列表赋值 # 定义一个新列表 l1 = [1, 2, 3, 4, 5] # 对l2赋值 l2 = l1 print(l1) l2[0] = 100 print(l1) 示例结果: [1, 2, 3, 4, 5] [100, 2, 3, 4, 5] 可以看到,更改赋值后的L2后L1同样也会被更改,看似简单的"复制"
随机推荐
- VBS中解决带空格路径的三种方法
- C#读写txt文件的2种方法
- 手把手教你清理系统垃圾文件
- Nginx的c30k问题解决方法
- Java反转字符串和相关字符编码的问题解决
- 在Java的Struts框架下进行web编程的入门教程
- C# 键盘Enter键取代Tab键实现代码
- 在Firefox下js select标签点击无法弹出
- python爬虫的工作原理
- 简单讲解C++的内部和外部函数以及宏的定义
- 详解MySQL中的分组查询与连接查询语句
- node.js中的path.isAbsolute方法使用说明
- css动态模糊效果
- XSL简明教程(6)XSL过滤和查询
- 用Ruby进行CGI编程的入门指引
- JavaScript组件焦点与页内锚点间传值的方法
- JavaScript实现三级联动效果
- SSH框架网上商城项目第16战之Hibernate二级缓存处理首页热门显示
- CSS TreeMenu 二级树形菜单示例
- 十大 Node.js 的 Web 框架(快速提升工作效率)