首先,我们知道Python3中,有6个标准的数据类型,他们又分为可以变和不可变。
不可变:Number(数字)、String(字符串)、Tuple(元组)。
可以变:List(列表)、Dictionary(字典)、Set(集合)。

一.浅拷贝

a 和 b 是一个独立的对象,但他们的子对象还是指向统一对象(是引用)
浅拷贝后,改变原始对象中为可变类型的元素的值,会同时影响拷贝对象;改变原始对象中为不可变类型的元素的值,不会响拷贝对象。

#定义一个列表,第一个元素是可变类型
>>> A = [[1,2],'fei',90]
#浅拷贝
>>> B = copy.copy(A)
#对象地址是否相同
>>> A is B
False
#第一个元素地址是否相同
>>> A[0] is B[0]
True
#第二个元素地址是否相同
>>> A[1] is B[1]
True
#改变第一个可变类型的值,查看复制对象变化
>>> A[0][0] = 2
>>> A
[[2, 2], 'fei', 90]
#复制对象也跟着改变了
>>> B
[[2, 2], 'fei', 90]
#改变第二个不可变类型的值,查看复制对象变化
>>> A[1] = 'anne'
>>> A
[[2, 2], 'anne', 90]
#复制对象没有改变
>>> B
[[2, 2], 'fei', 90]

二.深拷贝

a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的。
深拷贝,除了顶层拷贝,还对子元素也进行了拷贝。
经过深拷贝后,原始对象和拷贝对象所有的可变元素地址都没有相同的了。

#深拷贝
>>> C = copy.deepcopy(A)
#对象地址是否相同
>>> A is C
False
#第一个元素地址是否相同
>>> A[0] is C[0]
False
#第二个元素地址是否相同
>>> A[1] is C[1]
True
#改变第一个元素,查看复制元素变化
>>> A[0][0] = 2
>>> A
[[2, 2], 'fei', 90]
#复制元素不变,对复制元素没影响
>>> C
[[1, 2], 'fei', 90]
#改变第二个元素,查看复制元素变化
>>> A[1] = 'Anne' >>> A
[[2, 2], 'Anne', 90]
#复制元素不变,对复制元素没影响
>>> C
[[1, 2], 'fei', 90]

在这里看到一个让我困惑的问题,A is B

三.赋值引用

a 和 b 都指向同一个对象

#赋值引用
>>> A = [[1,2],'fei',90]
>>> D = A
#对象地址是否相同
>>> A is D
True
#第一个元素地址是否相同
>>> A[0] is D[0]
True
#第二个元素地址是否相同
>>> A[1] is D[1]
True
#改变A中第一个元素,查看是否影响D
>>> A[0][0] = 2
>>> A
[[2, 2], 'fei', 90]
#D中第一个元素也跟着改变
>>> D
[[2, 2], 'fei', 90]
#改变D中第二个元素,查看是否影响A
>>> D[1] = 'anne'
#A中第二个元素也改变了
>>> A
[[2, 2], 'anne', 90]
>>> D
[[2, 2], 'anne', 90]
>>>

python中浅拷贝和深拷贝分析的更多相关文章

  1. Python中浅拷贝和深拷贝的区别总结与理解

    单层浅拷贝 import copy a = 1 # 不可变数据类型 copy_a = copy.copy(a) print(id(a),id(copy_a)) # 内存地址相同 a = [1,2] # ...

  2. python中浅拷贝和深拷贝的区别

    浅拷贝 可变类型浅拷贝copy函数就是浅拷贝,只对可变类型的第一层对象进行拷贝,对拷贝的对象开辟新的内存空间进行存储,不会拷贝对象内部的子对象可变类型:a = [1, 2, 3] b = [11, 2 ...

  3. 深度解析:python之浅拷贝与深拷贝

    深度解析python之浅拷贝与深拷贝 本文包括知识点: 1.copy与deepcopy 2.可变类型与不可变类型 1.copy与deepcopy 在日常python编码过程中,经常会遇见变量的赋值.这 ...

  4. Python中复制、深拷贝和浅拷贝的区别

    深拷贝定义(deepcopy) 在Python中,由于一切皆对象,所以任何变量都可以被引用,也即可以被赋值给任何变量.但是在Python中,给变量赋值,是区分的,一般情况下,Python中的变量赋值都 ...

  5. python中赋值,深拷贝,浅拷贝区别

    这三种 的区别就是 复制的变量 是否是原变量的引用. 赋值:只是原变量的引用. 浅拷贝和深拷贝的区别 需要通过 子元素 区分 浅拷贝:子元素的 引用相同 深拷贝:所以引用都不相同,完全复制一份 这三种 ...

  6. python的浅拷贝和深拷贝

    python对象有两种拷贝的形式:浅拷贝和深拷贝. 在<python核心编程>中看到对这两种拷贝的分析,觉得十分收益,所以记录在此. id()方法:id()方法可以查看某个对象的ID,类似 ...

  7. python之浅拷贝和深拷贝

    1.浅拷贝 1>赋值:从下面的例子我们可以看到赋值之后新变量的内存地址并没有发生任何变化,实际上python中的赋值操作不会开辟新的内存空间,它只是复制了新对象的引用,也就是说除了b这个名字以外 ...

  8. python:浅拷贝与深拷贝

    1,“相等”与“相同” 我们先赋值三个变量a, b, c: a = [1, 2, [1, 2]] b = [1, 2, [1, 2]] c = a 判断一下‘相等’: a == b  返回 True ...

  9. Python的浅拷贝与深拷贝

    定义: =号浅拷贝:在Python中对象的赋值其实就是对象的引用.copy了之后两个仍然是同一个东西.那么他们内部的元素自然也是一样的,对其中一个进行修改,另一个也会跟着变> copy()浅拷贝 ...

随机推荐

  1. [HNOI2011]括号修复 / [JSOI2011]括号序列

    传送门 Solution 一道题花费了两天的时间-- 在大佬@PinkRabbit的帮助下,终于AC了,感动-- 首先,我们考虑一个括号序列被修改成合法序列需要的次数: 我们需要修改的其实是形如... ...

  2. Tkinter 之Frame标签

    一.参数说明 语法 作用 width 设置 Frame 的宽度默认值是 0 height 设置 Frame 的高度默认值是 0 background(bg) 设置 Frame 组件的背景颜色 bord ...

  3. [APIO2015]八邻旁之桥——非旋转treap

    题目链接: [APIO2015]八邻旁之桥 对于$k=1$的情况: 对于起点和终点在同侧的直接计入答案:对于不在同侧的,可以发现答案就是所有点坐标与桥坐标的差之和+起点与终点不在同一侧的人数. 将所有 ...

  4. OpenFOAM中的基本变量快速认知【转载】

    转载自:http://blog.sina.com.cn/s/blog_a0b4201d0102vsf9.html label 实际上就是整型数据的变体,int,OF对它进行了包装,以适应32或64位系 ...

  5. NAT(地址转换技术)学习

    一.什么是NAT,NAT产生的背景 NAT通常部署在一个组织的网络出口位置,通过将内部网络IP地址替换为出口的IP地址提供公网可达性和上层协议的连接能力. NAT产生的背景是为了解决IPv4地址不足的 ...

  6. 报错:使用java api连接redis集群时报错 READONLY You can't write against a read only slave.

    报错: READONLY You can’t write against a read only slave. 报错原因: 因为连接的是从节点,从节点只有读的权限,没有写的权限 解决方案: 进入red ...

  7. CPU | 物理 CPU vs 逻辑 CPU vs 核心 vs 线程 vs Socket

    当我们试着通过 Linux 命令 nproc 和 lscpu 了解一台计算机 CPU 级的架构和性能时,我们总会发现无法正确地理解相应的结果,因为我们会被好几个术语搞混淆:物理 CPU.逻辑 CPU. ...

  8. vue设置公共常量

    Global.vue <template> </template> <script type="text/javascript"> const ...

  9. 90后外挂开发者:已经有许多主播在我这里在外挂,我月入50W

    绝地求生上线不到一年已经火爆全球,玩家们表示再差的优化也抵挡不住我们玩游戏的热情,近日,各大平台主播糯米油条五五开等人的开挂实锤闹得沸沸扬扬,玩家之间刮起了一阵反击外挂的风暴. 俗话说得好,没有买卖就 ...

  10. 终极解决办法rvct Cannot obtain license for Compiler (feature compiler) with license version >= 3.1

    参考:https://blog.csdn.net/nic_r/article/details/7458038 ARM C/C++ Compiler, RVCT4. [Build ] armcc : e ...