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. 用Python从头开始构建神经网络

    神经网络已经被开发用来模拟人脑.虽然我们还没有做到这一点,但神经网络在机器学习方面是非常有效的.它在上世纪80年代和90年代很流行,最近越来越流行.计算机的速度足以在合理的时间内运行一个大型神经网络. ...

  2. C# 将json字符串进行排序 转成键值

    public static string StortJson(string json) { var dic = JsonConvert.DeserializeObject<SortedDicti ...

  3. Dubbo服务引用源码解析③

    ​ 上一章分析了服务暴露的源码,这一章继续分析服务引用的源码.在Dubbo中有两种引用方式:第一种是服务直连,第二种是基于注册中心进行引用.服务直连一般用在测试的场景下,线上更多的是基于注册中心的方式 ...

  4. 卷积神经网络CNN-学习1

    卷积神经网络CNN-学习1 十年磨一剑,霜刃未曾试. 简介:卷积神经网络CNN学习. CNN中文视频学习链接:卷积神经网络工作原理视频-中文版 CNN英语原文学习链接:卷积神经网络工作原理视频-英文版 ...

  5. java中使用IO流复制文件

    public class TestIO { public static void main(String[] args) { // TODO Auto-generated method stub tr ...

  6. @RequestBody,@RequestParam请求数据接收数据

    一. @RequestBody 注解 @RequestBody是用于解析body中的json内容,对于我们使用时候我们需要指定Content-Type参数为application/json,标识我们需 ...

  7. sql中筛选条件为空值

    <select id="getEmployeeBasicInformationList" resultType="org.springblade.entity.Al ...

  8. Spring Cloud Config应用篇(九)

    一.SpringCloud Config 配置中心 1.1.配置中心说明 SpringCloud Config 服务器以下简称"配置中心". Spring Cloud Config ...

  9. redo log 有什么作用?

    mysql 为了提升性能不会把每次的修改都实时同步到磁盘,而是会先存到Boffer Pool(缓冲池)里头,把这个当作缓存来用.然后使用后台线程去做缓冲池和磁盘之间的同步. 那么问题来了,如果还没来的 ...

  10. 【转载】VUE的背景图引入

    我现在的项目要将登录页面的背景引一图片做为背景图片,按原jsp中的写法,发现无法找到背景图片,最后从网上查资料,采用上面的写法,成功显示出背景图片,参考网址 https://blog.csdn.net ...