深浅拷贝(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中的数字.字符串.元组等,如果存放在了内存中,这部分内存里面的内容是不会改变的,但是也有情况,内存中存放了可变对象,比如说列表和字典,他们的 ...
随机推荐
- 应用安全 - 工具 - Jmeter - 漏洞 - 汇总
CVE-2018-1297 Date 类型 rmi 反序列化导致远程代码执行 影响范围
- eclipse SVN插件的日常使用
安装(我的安装方法,怎么方便怎么来) 1.打开eclipse,选择Help->Eclipse MarketPlace,搜索subclipse,点击install,等待.安装成功后会询问重启,点击 ...
- 统计学习方法 | 第1章 统计学习方法概论 | numpy.linspace()
numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None) 在指定的间隔内返回均匀间隔的数字. 返回nu ...
- flutter环境配置(windows)
参考以下链接 下载安装步骤: https://www.cnblogs.com/yangyxd/p/8809512.html 安装Flutter环境遇到Android license status un ...
- sqlalchemy链接数据库
from sqlalchemy import create_engine HOSTNAME = '127.0.0.1' PORT = 3306 DATABASE = 'first_sqlalchemy ...
- DES、AES和RSA加密算法
DES加密算法简介 DES(Data Encryption Standard)是目前最为流行的加密算法之一(它是分组密码). 强加密使用的基本操作 -> 混淆与扩散 混淆:是一种使密钥与密文之间 ...
- 10分钟学会web通讯的四种方式,短轮询、长轮询(comet)、长连接(SSE)、WebSocket
一般看到标题我们一般会产生下面几个问题??? 什么是短轮询? 什么是长轮询? 长连接又是什么? wensocket怎么实现呢? 他们都能实现web通讯,区别在哪呢,哪个好用呢? 接下来我们就一个个来了 ...
- 创建Maven Web项目时很慢解决办法
点击加号,Name输入archetypeCatalog,Value输入internal archetypeCatalog表示插件使用的archetype元数据,不加这个参数时默认为remote,loc ...
- 有关最短路上的第k小/大值的总结
1.USACO08JAN Telephone Lines 题面 由于问的是最大值最小,所以二分加验证就好了 比较显然的,题干问的是第k+1长的路最短: 那么二分答案是正确的方向: 但是怎么验证? 我 ...
- thinkphp6下无法获取header头中的Authorization(apache版)
今天遇到在thinkphp框架中获取不到header头里边的 Authorization ,后来在.htaccess里面加多一项解决,记录下: <IfModule mod_rewrite.c&g ...