python之拷贝(深浅)
深浅拷贝
深浅拷贝分为两部分,一部分是数字和字符串另一部分是列表、元组、字典等其他数据类型。
数字和字符串
对于数字和字符串而言,赋值、浅拷贝和深拷贝无意义,因为他们的值永远都会指向同一个内存地址。

# 导入copy模块
>>> import copy
# 定义一个变量var1
>>> var1 = 123
# 输出var1的内存地址
>>> id(var1)
1347747440
>>> var2 = var1
# var2的内存地址和var1相同
>>> id(var2)
1347747440
# 浅拷贝
>>> var3 = copy.copy(var1)
# var3的内存地址和var1相同
>>> id(var3)
1347747440
# 深拷贝
>>> var4 = copy.deepcopy(var1)
# var4的内存地址和var1相同
>>> id(var4)
1347747440

其他数据类型
对于字典、元祖、列表 而言,进行赋值、浅拷贝和深拷贝时,其内存地址的变化是不同的。
- 创建一个字典
var1
var1 = {"k1": "1", "k2": 2, "k3": ["abc", 456]}
赋值
赋值,只是创建一个变量,该变量指向原来内存地址,如:

>>> var1 = {"k1": "1", "k2": 2, "k3": ["abc", 456]}
>>> var2 = var1
>>> id(var1)
1937003361288
>>> id(var2)
1937003361288

如图所示:

浅拷贝
浅拷贝,在内存中只额外创建第一层数据

# 导入拷贝模块
>>> import copy
>>> var1 = {"k1": "1", "k2": 2, "k3": ["abc", 456]}
# 使用浅拷贝的方式
>>> var2 = copy.copy(var1)
# 两个变量的内存地址是不一样的
>>> id(var1)
2084726354952
>>> id(var2)
2084730248008
# 但是他们的元素内存地址是一样的
>>> id(var1["k1"])
2084726207464
>>> id(var2["k1"])
2084726207464

如图所示:

深拷贝
深拷贝,在内存中将所有的数据重新创建一份(排除最后一层,即:python内部对字符串和数字的优化)

# 导入拷贝模块
>>> import copy
>>> var1 = {"k1": "1", "k2": 2, "k3": ["abc", 456]}
# 使用深拷贝的方式把var1的内容拷贝给var2
>>> var2 = copy.deepcopy(var1)
# var1和var2的内存地址是不相同的
>>> id(var1)
1706383946760
>>> id(var2)
1706389852744
# var1和var2的元素"k3"内存地址是不相同的
>>> id(var1["k3"])
1706389853576
>>> id(var2["k3"])
1706389740744
# var1和var2的"k3"元素的内存地址是相同的
>>> id(var1["k3"][1])
1706383265744
>>> id(var2["k3"][1])
1706383265744

如图所示:


import copy # 对数字 字符串
# a = 1
# b = a
#
# print(id(a) == id(b))
# b = 12
# print(a, b)
# print(id(a) == id(b)) # a = 'aa'
# b = copy.copy(a)
# print(a, b)
# print(id(a) == id(b))
#
# b = 'bb'
# print(a, b)
# print(id(a) == id(b)) # c = copy.deepcopy(a)
# print(a, c)
# print(id(a) == id(c))
#
# c = 'cc'
# print(a, c)
# print(id(a) == id(c))\ # a = [1, 2, 3, 4, 5]
#
# b = a
#
# b[1] = 5
# print(a, b)
# print(id(a) == id(b)) #
# a = [1, 2, 3, 4, 5, [1, 2]]
# b = copy.copy(a)
# print(a, b)
# print(id(a) == id(b))
# print(id(a[1]) == id(b[1]))
# print(id(a[5]) == id(b[5]))
# b[1] = 10
# print(a[1])
# print(id(a[1]) == id(b[1]) )
#
# print('----------')
# print(id(a[5][0]) == id(b[5][0]))
# b[5][0] = 50
# print(a[5][0])
# print(id(a[5][0]) == id(b[5][0])) a = [1, 2, 3, 4, 5, [5, [[1,2],8]], {'a': 'aa'}]
b = copy.deepcopy(a)
print(id(a) == id(b))
print(id(a[3]) == id(b[3]))
print(id(a[5]) == id(b[5]))
# b[3] = 20
# print(a, b )
print(id(a[5][1][0][1]) == id(b[5][1][0][1]))
b[5][1][0] = 20
print(a[5][1][0])
优秀的深浅拷贝博客https://www.cnblogs.com/fandx/p/10462913.html?tdsourcetag=s_pctim_aiomsg
python之拷贝(深浅)的更多相关文章
- 第五篇python进阶之深浅拷贝
目录 第五篇python进阶之深浅拷贝 一.引言 1.1可变 和不可变 二.拷贝(只针对可变数据类型) 三.浅拷贝 四.深拷贝 第五篇python进阶之深浅拷贝 一.引言 1.1可变 和不可变 id不 ...
- 天啦噜!仅仅5张图,彻底搞懂Python中的深浅拷贝
Python中的深浅拷贝 在讲深浅拷贝之前,我们先重温一下 is 和==的区别. 在判断对象是否相等比较的时候我们可以用is 和 == is:比较两个对象的引用是否相同,即 它们的id 是否一样 == ...
- Python 中的深浅拷贝
Python 中的深浅拷贝 参考文献:https://blog.csdn.net/lnotime/article/details/81194633 参考文献:https://blog.csdn.net ...
- 【Python】Python中的深浅拷贝
[转]python 复制(拷贝)对象 -- ::| 分类: Python |举报|字号 订阅 下载LOFTER我的照片书 | 需求: 你想复制一个对象.因为在Python中,无论你把对象做为参数传递, ...
- python的拷贝方式以及深拷贝,浅拷贝详解
python的拷贝方法有:切片方法, 工厂方法, 深拷贝方法, 浅拷贝方法等. 几种方法都可以实现拷贝操作, 具体区别在于两点:1.代码写法不同. 2.内存地址引用不同 代码演示: import co ...
- python——赋值与深浅拷贝
初学编程的小伙伴都会对于深浅拷贝的用法有些疑问,今天我们就结合python变量存储的特性从内存的角度来谈一谈赋值和深浅拷贝~~~ 预备知识一——python的变量及其存储 在详细的了解python中赋 ...
- Python中的深浅拷贝
1.什么是深浅拷贝? python中一切皆对象,python中的数字.字符串.元组等,如果存放在了内存中,这部分内存里面的内容是不会改变的,但是也有情况,内存中存放了可变对象,比如说列表和字典,他们的 ...
- python基础(6)-深浅拷贝
赋值 字符串和数字 # id()函数可以获取变量在内存中的地址标识 num1 = 2; num2 = 2; print(id(num1)) # result:8791124202560 print(i ...
- Python学习(006)-深浅拷贝及集合
深浅拷贝 import copy husband=['xiaoxin',123,[200000,100000]] wife=husband.copy() #浅拷贝 wife[0]='xiaohong ...
随机推荐
- storm源码分析之任务分配--task assignment
在"storm源码分析之topology提交过程"一文最后,submitTopologyWithOpts函数调用了mk-assignments函数.该函数的主要功能就是进行topo ...
- Part3_lesson3---ARM伪指令学习
1.ARM机器码 对elf格式的文件进行反汇编可得到相应汇编文件的机器码: arm-linux-objdump -D -S start.elf 机器码的解析,可以参考文件ARM Architectur ...
- 《the art of software testing》第四章 测试用例的设计
白盒测试 逻辑覆盖测试: 逻辑覆盖是以程序内部的逻辑结构为基础的设计测试用例的技术.它属白盒测试.白盒测试的测试方法有代码检查法.静态结构分析法.静态质量度量法.逻辑覆盖法.基本路径测试法.域测试.符 ...
- Html5-Video标签以及字幕subtitles和captions的区别
<video id="mainvideo" src="video.mp4" type="video/mp4"controls auto ...
- HTML5之:link与title的区别
[link]标签:外联导入样式 例1:<link rel="stylesheet" type="text/css" href="theme.cs ...
- EasyUI学习笔记(1)----Tree控件实现过程中.NET下无法访问json数据的解决办法
直接调用官网的Demo中的方法 , 将json数据存储在同目录下,但是在运行之后树没有出现,用FireBug调试,错误如下 不允许访问json数据,刚开始以为是权限不够,然后又给解决方案所在的文件夹设 ...
- 享元(Flyweight)模式
享元(Flyweight)模式:运用共享技术有效的支持大量细粒度的对象. /* * 抽象享元(Flyweight)角色:此角色是所有的具体享元类的超类,为这些类规定出需要实现的公共接口. 那些需要外蕴 ...
- MVC - Routing - 网址路由
1. Routing : 路由 主要是比对通过浏览器传来的http要求与响应适当的网址给浏览器. @Html.ActionLink("关于","About", ...
- HTML <area> 标签区域map标签
1.距形:(左上角顶点坐标为(x1,y1),右下角顶点坐标为(x2,y2)) <area shape="rect" coords="x1,y1,x2,y2" ...
- 【转】ANDROID自定义视图——onLayout源码 流程 思路详解
转载(http://blog.csdn.net/a396901990) 简介: 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量——onMeasure():决定View的大小 2.布局 ...