深浅拷贝(copy)
copy 模块
1.拷贝(赋值)
1). x为不可变数据类型
x = 10
y = x
print(x,y)
print(id(x),id(y))
x += 1
print(x,y)
print(id(x),id(y))
'''
10 10
1828744960 1828744960
11 10
1828744992 1828744960
'''
结论:y为x的拷贝对象,x为不可变数据类型,x变化y 不变;
2). x为可变数据类型
x = [1,2,3]
y = x
print(x,y)
print(id(x),id(y))
x += [4]
print(x,y)
print(id(x),id(y))
'''
[1, 2, 3] [1, 2, 3]
167373768 167373768
[1, 2, 3, 4] [1, 2, 3, 4]
167373768 167373768
'''
结论:当y为x的拷贝对象,x为可变数据类型,x变化y也变;
3). 可变数据类型(比如列表)内,既有不可变元素,又有容器类型可变元素(比如列表)
# 没添加新元素前
l1 = [1,2,3,[4,5]]
l2=l1
print('id(l1):',id(l1))
print('id(l2):',id(l2))
print(id(l1[0]))
print(id(l1[1]))
print(id(l1[2]))
print(id(l1[3]))
print(id(l1[3][0]))
print(id(l1[3][1]))
print('='*50)
print(id(l2[0]))
print(id(l2[1]))
print(id(l2[2]))
print(id(l2[3]))
print(id(l2[3][0]))
print(id(l2[3][1]))
'''
1843162592
1843162624
1843162656
167373768
1843162688
1843162720
==================================================
1843162592
1843162624
1843162656
167373768
1843162688
1843162720
'''
# 添加新元素后
# l1中添加一个不可变类型元素l1.append(4);在l1[3]中添加一个不可变元素l1[3].append(6);
l1 = [1,2,3,[4,5]]
l2=l1
l1.append(4)
l1[3].append(6)
print('id(l1):',id(l1))
print('id(l1[3]):',id(l1[3]))
print('l1:',l1)
print('='*50)
print('id(l2):',id(l2))
print('id(l2[3]):',id(l2[3]))
print('l2:',l2)
'''
id(l1): 167761224
id(l1[3]): 167718088
l1: [1, 2, 3, [4, 5, 6], 4]
==================================================
id(l2): 167761224
id(l2[3]): 167718088
l2: [1, 2, 3, [4, 5, 6], 4]
'''
结论: 当l2为l1的拷贝对象,l1内部的不可变数据变化,lt2变;l1内部的可变数据变化,l2也变(*****)
2.浅拷贝
# 没添加新元素前
import copy
l1 = [1,2,3,[4,5]]
l2 = copy.copy(l1)
print('id(l1):',id(l1))
print(id(l1[0]))
print(id(l1[1]))
print(id(l1[2]))
print(id(l1[3]))
print(id(l1[3][0]))
print(id(l1[3][1]))
print('='*30)
print('id(l2):',id(l2))
print(id(l2[0]))
print(id(l2[1]))
print(id(l2[2]))
print(id(l2[3]))
print(id(l2[3][0]))
print(id(l2[3][1]))
print('l2:',l2)
'''
id(l1): 167761224
1681026528
1681026560
1681026592
id(l1[3]:) 167718088
1681026624
1681026656
==============================
id(l2): 167778760
1681026528
1681026560
1681026592
id(l2[3]:) 167718088
1681026624
1681026656
l2: [1, 2, 3, [4, 5]]
'''
# 添加新元素后
import copy
l1 = [1,2,3,[4,5]]
l2 = copy.copy(l1)
l1.append(4)
l1[3].append(6)
print('l1:',l1)
print('id(l1):',id(l1))
print('id(l1[3]):',id(l1[3]))
print('='*30)
print('l2:',l2)
print('id(l2):',id(l2))
print('id(l2[3]):',id(l2[3]))
'''
l1: [1, 2, 3, [4, 5, 6], 4]
id(l1): 167761224
id(l1[3]): 167718088 # l2为l1的浅拷贝对象,l1中的容器类型的内存地址与l2中的相同。
==============================
l2: [1, 2, 3, [4, 5, 6]]
id(l2): 167778760
id(l2[3]): 167718088
'''
结论:当l2为l1的浅拷贝对象时,l1内部的不可变元素变化,l2不变;l1内部的可变元素变化,l2也变(*********)
3.深拷贝
# 没添加新元素前
import copy
l1 = [1,2,3,[4,5]]
l2 = copy.deepcopy(l1)
print('id(l1):',id(l1))
print(id(l1[0]))
print(id(l1[1]))
print(id(l1[2]))
print('id(l1[3]:',id(l1[3]))
print(id(l1[3][0]))
print(id(l1[3][1]))
print('='*30)
print('id(l2):',id(l2))
print(id(l2[0]))
print(id(l2[1]))
print(id(l2[2]))
print('id(l2[3]:',id(l2[3]))
print(id(l2[3][0]))
print(id(l2[3][1]))
print('l2:',l2)
'''
id(l1): 167761224
2012048864
2012048896
2012048928
id(l1[3]: 167718088
2012048960
2012048992
==============================
id(l2): 167778760
2012048864
2012048896
2012048928
id(l2[3]: 167778376
2012048960
2012048992
l2: [1, 2, 3, [4, 5]]
'''
# l2位l1的深拷贝对象,容器l2和容器l2内部的容器所对应的内存地址与l1都不同,相当于又重新开辟了新的内存空间
# 添加新元素后
import copy
l1 = [1,2,3,[4,5]]
l2 = copy.deepcopy(l1)
l1.append(4)
l1[3].append(6)
print('l1:',l1)
print('id(l1):',id(l1))
print('id(l1[3]):',id(l1[3]))
print('='*30)
print('l2:',l2)
print('id(l2):',id(l2))
print('id(l2[3]):',id(l2[3]))
'''
l1: [1, 2, 3, [4, 5, 6], 4]
id(l1): 167761224
id(l1[3]): 167718088
==============================
l2: [1, 2, 3, [4, 5]]
id(l2): 167778760
id(l2[3]): 167778376
'''
# l1容器内及l1内部容器内添加新元素,l2容器及其内部容器内并没有添加新元素;
结论: 当l2是l1的深拷贝对象时,l1内部的不可变类型变化,l2不变;l1内部的可变类型变化,l2不变(*****)
4.拷贝现象总结及画图解释

总结:
拷贝:当l2为l1的拷贝对象,l1内部的可变或不可变数据变化,lt2变;(*****)
浅拷贝: 当l2为l1的浅拷贝对象时,l1内部的不可变元素变化,l2不变;l1内部的可变元素变化,l2变(*********)
深拷贝:当l2是l1的深拷贝对象时,l1内部的不可变类型变化,l2不变;l1内部的可变类型变化,lt2不变(*****)
深浅拷贝(copy)的更多相关文章
- python基础--深浅拷贝copy
拷贝是音译的词,其实他是从copy这个英文单词音译过来的,那什么是copy? copy其实就是复制一份,也就是所谓的抄一份.深浅copy其实就是完全复制一份,和部分复制一份的意思. 1.赋值运算 l1 ...
- Python_深浅拷贝
深浅拷贝 ‘copy’和'='的区别:copy会开辟一个新的空间,而‘=’不会. 浅copy只会copy第一层,再里边的就进行共享了. 需要记住的是copy之后记住的是内存寻址地址,而浅copy时如果 ...
- @proprety数组字典字符串用copy和strong区别(深浅拷贝)
//// @proprety数组字典字符串用copy和strong区别(深浅拷贝).h// IOS笔记//// /* _proprety________copy_strong_________h ...
- 关于:1.指针与对象;2.深浅拷贝(复制);3.可变与不可变对象;4.copy与mutableCopy的一些理解
最近对深浅拷贝(复制)做了一些研究,在此将自己的理解写下来,希望对大家有所帮助.本人尚处在摸索阶段,希望各位予以指正. 本文包括如下方向的探索: 1.指针与对象: 2.深/浅拷贝(复制): 3.可变/ ...
- copy之深浅拷贝
深浅拷贝深拷贝 全部复制浅拷贝 只复制第一层 __author__ = 'Perfect' # -*- coding: utf-8 -*- import copy # copy.copy() #浅拷贝 ...
- 深浅拷贝的应用-copy、mutableCopy
ViewController.h #import <UIKit/UIKit.h> @interface ViewController : UIViewController //如果想让li ...
- Python 从零学起(纯基础) 笔记 之 深浅拷贝
深浅拷贝 1. import copy#浅拷贝copy.copy()#深拷贝copy.deepcopy()#赋值 = 2. 对于数字和字符串而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个 ...
- python——赋值与深浅拷贝
初学编程的小伙伴都会对于深浅拷贝的用法有些疑问,今天我们就结合python变量存储的特性从内存的角度来谈一谈赋值和深浅拷贝~~~ 预备知识一——python的变量及其存储 在详细的了解python中赋 ...
- Python中的深浅拷贝
1.什么是深浅拷贝? python中一切皆对象,python中的数字.字符串.元组等,如果存放在了内存中,这部分内存里面的内容是不会改变的,但是也有情况,内存中存放了可变对象,比如说列表和字典,他们的 ...
随机推荐
- OKR工作法 目标明确的写下来 - 结果记录- 校准
1.o - objective - 旅程的目的地 - 方向 - 定性的 2.kr - key result - 旅途的下一跳和关键节点 - 定量的 - 需要停下来校准 ################ ...
- VS2017:"64位调试操作花费的时间比预期要长",无法运行调试解决办法
关于这个问题网上搜了好久,参考http://www.yishimei123.com/network/685.html这篇文章,最后终于解决了,在此表示非常感谢! 我的环境是:win10+VS2017 ...
- selenium 安装流程
安装 1.安装python 2.cmd中输入:pip install selenium 输入pip show selenium检查是否安装完成 3.下载chromedriver 在浏览器中输入chro ...
- 多线程--CreateThread与_beginthreadex本质区别
转载 MoreWindows: 秒杀多线程第二篇 本文将带领你与多线程作第一次亲密接触,并深入分析 CreateThread与_beginthreadex的本质区别,相信阅读本文后你能轻松的使用多线程 ...
- Linux就该这么学——安装配置VM虚拟机
Vm虚拟机下载地址 : https://cloud.189.cn/t/zAfaQvJZRziu (访问码:6717) rehl镜像下载地址 : https://cloud.189.cn/t/67BJ ...
- 网络信息统计netstat|ss|ip
1:netstate[弃用] netstat的作用: 需求 原命令 新命令 1:网络连接 netstat -a ss 2:路由表 netstat -r ip route 3:统计接口 netstat ...
- POI操作OFFICE转HTML
由于项目需求,需要上传在线预览生成的office文件,经过一番痛苦的研究,目前已经成功将DOC.DOCX.PPTX不乱码转换成功,PPT当字体不是宋体时出现乱码,至今无法解决,待日后再研究吧.而EXC ...
- java中代码块和构造方法以及普通方法的代码执行顺序总结
说实话,这块真的不好理解啊~都怪jvm 执行顺序搞这么复杂,哼╭(╯^╰)╮ 但是 我们能怎么办,只能研究呗!!! !:首先,毫无置疑的,静态代码块在加载时就执行了,所以肯定是最先执行的.... ...
- GO语言(golang)官方网站!
GO语言官方网站,在上面可以查看所有API文档.使用在线工具编写程序,你可以去看看!! https://golang.org/
- mybatis-generator的功能扩展
项目代码地址:https://github.com/whaiming/java-generator 我在原有的基础上扩展了和修改了一些功能: 1.增加获取sqlServer数据库字段注释功能 2.Ma ...