Python赋值、浅复制和深复制

首先我们需要知道赋值和浅复制的区别:

赋值和浅复制的区别

赋值,当一个对象赋值给另一个新的变量时,赋的其实是该对象在栈中的地址,该地址指向堆中的数据。即赋值后,两个对象指向的是堆中同一块内存空间。当任何一个对象发生某些改变时,另一个也会发生同样的改变。这里的两个对象其实就是两个引用。

而浅复制,它会创建一个新的对象,即会在堆内存区开辟一个新的内存区域,存储新的对象,但是新的对象内存的只是原对象内元素的引用。当原对象的数据都是不可变数据时,此时浅复制和深复制是一样的。若是原对象内有可变数据,那么也只是复制那个可变数据的引用。

所以二者的区别即,赋值只不过给那段内存数据多起了一个名字,但是东西还是一个东西。而浅复制是创造了一个新的对象,并复制了原对象中所有的引用。

浅复制和深复制的区别

浅复制上面已经说过了。

深复制,深复制也会创建一个新的对象,会在内存当中开辟一个新的空间,对于不可变数据和浅复制是一样的,但是对于可变数据,深复制会在堆内存中创建一个一模样的数据,并返回引用,此时两个可变数据的内容一模一样,但是内存地址并不一样。

所以二者的区别就在于可变数据的复制,浅复制复制之后可变数据和原来的可变数据是同一块内存,改变这个数据,二者都将改变。而深复制,两个对象无论怎么变化都不会有相互影响。


浅复制的6种方法(有些是针对列表的)

原数据a = [1, 2, 3]

  • b = a[:],这个操作其实就是列表的切片操作,但是比较特殊,因为切出来的就是自己
  • b = list(a),这个操作针对的不仅仅是列表,a可以是别的可变为列表的数据
  • b = a * 1, 这个不做过多解释
  • b = [x for x in a],这个就是做了一个遍历的操作,并把引用复制一遍,即浅复制了。
  • b = a.copy(),这个是列表自带的浅复制,同样字典也有(二者都是可变数据)
  • b = copy.copy(a),这个就是借助copy模块里面的浅复制。

深复制的方法

  • b = copy.deepcopy(a), 这个也是借助copy模块,copy模块里面有个deepcopy方法,也就是深复制。

讲的多不如例子来的实在

赋值和浅复制的区别

import copy
a = [1, 2, 3, [4, 5]]
# 赋值
b = a
# 浅复制
c = a[:]
# 改变原数据
a[3].append(6)
a.append(7)
# 输出地址
print(id(a), id(b), id(c)) # 140212335295536 140212335295536 140212335367104
print(a)
print(b)
print(c)

b是赋值所以会和a一模一样,而c是浅复制,所以改变列表中的列表时c会跟着改变,但是增加一个元素时并不会跟着改变。

深复制和浅复制的区别

import copy
a = [1, 2, 3, [4, 5]]
# 浅复制
b = a[:]
# 深复制
c = copy.deepcopy(a)
# 改变原数据
a[3].append(6)
a.append(7)
# 输出地址
print(id(a), id(b), id(c)) # 140212335378752 140212335373280 140212335378912
print(a)
print(b)
print(c)

b是浅复制,会和上述的c相同,而此例子中的c是深复制,并不会有什么改变

使用所有的复制方法来一个

a = [1, 2, 3, [4, 5], "Hello"]
b = a # 赋值
# 浅复制
c = a[:]
d = list(a)
e = a * 1
f = [x for x in a]
g = a.copy()
h = copy.copy(a)
i = copy.deepcopy(a) # 深复制
# 改变
a[3].append(6)
a[4] = "World"
a.append(7)
# 输出
print(a)
print(b)
print(c)
print(d)
print(e)
print(f)
print(g)
print(h)
print(i)

这个例子好好看看,思考思考吧。

以上就是全部内容,若有错误请直接打脸指正!!!

Python赋值、浅复制和深复制的更多相关文章

  1. Python中的浅复制、深复制

    参考 https://docs.python.org/3/library/copy.html?highlight=copy%20copy#copy.copy https://en.wikipedia. ...

  2. Python学习日记之字典深复制与浅复制

    Python中通过copy模块有两种复制(深复制与浅复制) copy 浅复制 复制时只会复制父对象,而不会复制对象的内部的子对象. deepcopy 深复制 复制对象及其子对象 因此,复制后对原dic ...

  3. Python笔记21-------浅复制和深复制、赋值

    上面图表示浅复制和深复制,针对顶层对象来说,赋值为引用,浅复制和深复制都是复制一个新的对象. 针对子对象来说,浅复制为引用.深复制就是复制两个一样的. 1.赋值 A= [ 1,2,3, [ 'a',' ...

  4. iOS 浅复制和深复制的深层理解,含示例

    转载:https://www.zybuluo.com/MicroCai/note/50592 版权归 @MicroCai 所有 以下是正文: 浅复制就是指针拷贝:深复制就是内容拷贝. 集合的浅复制 ( ...

  5. java基础-浅复制与深复制的理解

    浅复制与深复制在很多编程语言中都有出现,那么什么是浅复制,什么是深复制呢? 要区分浅复制与深复制,首先我们要明确什么是复制,怎样才算是复制.复制的例子在生活中也随处可见,如复印一份文档,复制一段文字等 ...

  6. iOS 浅复制、深复制、完全复制的知识点梳理验证(附加归档解档)

    在之前转载的一片文章中,文中对浅复制和深复制进行了详细的解读,同时还提到了深复制(one-level-deep copy).完全复制(true copy)的概念,并指出iOS开发中的深复制是单层深赋值 ...

  7. 深度解析javascript中的浅复制和深复制

    原文:深度解析javascript中的浅复制和深复制 在谈javascript的浅复制和深复制之前,我们有必要在来讨论下js的数据类型.我们都知道有Number,Boolean,String,Null ...

  8. Java中引用的浅复制和深复制

    Java中除了基本类型int,char,double等的赋值是按照值传递之外,其余的类型和对象都是按照引用进行传递的. 下面来看一个关于引用的例子. package referenceCopy;// ...

  9. 设计模式——浅复制VS深复制

    背景 在学习原型模式的时候,採用了一个差别与其它模式的新方法.採用了"克隆(Clone)方法.通过实现ICloneable接口中的Clone()方法来达到克隆的目的. 代码实现过程中,存在了 ...

随机推荐

  1. tomcat8默认umask已改为027

    1. umask的简单介绍 不过我们通常只用后三位,同样对应属主属组以及其他用户的权限,例如你的账号umask值为0022(可直接通过umask命令查看), 此时你创建的文件权限默认为644(文件初始 ...

  2. Python3和高性能全文检索引擎Redisearch进行交互

    安装 pip install redisearch 使用 from redisearch import Client, TextField # 创建一个客户端与给定索引名称 client = Clie ...

  3. ceph新加存储节点

    随着业务的扩展,原有的存储池不够用了,这时我们就需要给ceph添加新的存储节点,这里以新加ceph-host-05节点为例   准备工作 给所有节点hosts文件添加10.30.1.225 ceph- ...

  4. PPT技术干货1(上)——设计审美

    序言 PPT直接反映了一个人的能力和态度,PPT能直接反映出老板最看重的4个关键能力: 逻辑思维:全局思考,洞察关键 数据思维:数据分析,指导决策 设计思维:美观大方,彰显专业 工作效率:效率高,出活 ...

  5. Kafka超详细学习笔记【概念理解,安装配置】

    目录 本篇要点 Kafka介绍 作为流处理平台的三种特性 主要应用 四个核心API 基本术语 快速开始 安装配置Zookeeper 下载kafka 配置文件 Windows的命令 启动Zookeepe ...

  6. Centos7 根目录存储空间扩展方法

    Centos7 根目录存储空间扩展方法   一.首先通过 df -hl 命令查看磁盘占用情况,其中根目录已经被占满,此时需要对其进行扩容   二.针对虚拟机环境的centos7系统根存储空间扩容,可利 ...

  7. Spring源码--debug分析循环依赖--构造器注入

    目的:源码调试构造器注入,看看是怎么报错的. spring:5.2.3 jdk:1.8 一.准备 首先准备两个循环依赖的类:userService和roleServic <bean id=&qu ...

  8. .NET 云原生架构师训练营(模块二 基础巩固 MongoDB 介绍和基础)--学习笔记

    2.5.1 MongoDB -- 介绍 mysql vs mongo 快速开始 mysql vs mongo 对比 mysql mongo 数据存储 table 二维表结构,需要预先定义结构 json ...

  9. JavaScript入门-学习笔记(一)

    JavaScript入门(一) 学习js之前,我们先来了解一下,什么是JavaScript? JavaScript是一种解释型语言.在运行的时候,一边读一边编译一边执行.简单来说就是,在执行js代码时 ...

  10. Android——几种数据存储应用浅谈

    (1)android中的数据存储主要有五种方式: 第一种.sharedPreferences存储数据, 适用范围:保存少量的数据,且这些数据的格式非常简单:字符串型.基本类型的值.比如应用程序的各种配 ...