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 实现数值积分与画图

    import numpy as np from scipy import integrate def half_circle(x): return (1 - x ** 2) ** 0.5 N = 10 ...

  2. MGRE综合实验

    实验要求: 实验拓扑: 一. R1-2-3构建星型结构的MGRE结构,R1为中心站点,假设R1的共有IP为固定地址 1. 配置IP地址 2. 配置缺省 3. 配置MGRE环境 在中心站点上: 在分支站 ...

  3. 网页客服思路以及QQ截图粘贴到聊天框功能

    功能: 1.客服需登录进入客服页面.用户无需登录,进入用户页面,直接获取sessionId作为id值. 2.用户进入页面并且发送消息时,客服才会获取到该用户,并在左侧列表显示. 3.点击用户名即可切换 ...

  4. C# 数组 ArrayList List<T>区别

    System.Collenctions和System.Collenctions.Generic 中提供了很多列表.集合和数组.例如:List<T>集合,数组Int[],String[] . ...

  5. Blogs实现侧边公告栏设置

    说明:只需要在博客侧边栏公告(支持HTML代码) (支持 JS 代码)里面添加如下代码 #1.博客运行时长统计 <!--博客运行时长显示开始--!> <div id="sh ...

  6. (四)linux的常用环境变量及设置

    一.为什么要设置环境变量 1.环境变量能解决什么问题? 你是否经历过输入$python命令后,屏幕上打印出python:command not found的尴尬:每一次都要输入$/home/tools ...

  7. linux不同环境变量文件的比较,如/etc/profile和/etc/environment

    /etc/profile 为系统的每个用户设置环境信息和启动程序,当用户第一次登录时,该文件被执行,其配置对所有登录的用户都有效. 当被修改时,必须重启才会生效.英文描述:"System w ...

  8. CentOS7的防火墙以及selinux介绍/安装telnet命令/安装netstat与ifconfig命令

    简介:firewall防火墙的使用 防火墙:主要用户信息安全防护,主要有软件防火墙和硬件防火墙.firewalld防火墙是软件防火墙,在centos7 之前默认采用的防火墙是iptables,而在ce ...

  9. 在C#中使用OpenCV(使用GOCW)

    在C#中使用OpenCV(使用GOCW) 1.什么是GOCW       为了解决在Csharp下编写OpenCV程序的问题,我做过比较深入的研究,并且实现了高效可用的方法GreenOpenCshar ...

  10. 卷积网络可解释性复现 | Grad-CAM | ICCV | 2017

    觉得本文不错的可以点个赞.有问题联系作者微信cyx645016617,之后主要转战公众号,不在博客园和CSDN更新. 论文名称:"Grad-CAM: Visual Explanations ...