Python中模块之copy的功能介绍
模块之copy的功能介绍
copy主要分两种:
1.浅拷贝
2.深拷贝
赋值:
在python中赋值算特殊的拷贝,其实赋值可以理解为同一个对象有两个名字,所以当其中一个发生变化,另一个也跟着会变化。
1.浅拷贝
创建
格式:copy.copy(x)
例如:n1 = 123
print(copy.copy(n1))
>>> 123
返回值:obj
#对于浅拷贝可以调用copy模块,当然也可以直接使用copy函数来执行,实际中直接使用copy函数比较常见。
int拷贝
例如:n1 = 123
n2 = copy.copy(n1)
print(id(n1))
print(id(n1))
>>> 1356861712
>>> 1356861712
#对于数值类型的拷贝,拷贝前后id一样,说明该拷贝的内存地址是一样的。
str拷贝
例如:n1 = 'abc'
n2 = copy.copy(n1)
print(id(n1))
print(id(n1))
>>> 16618528
>>> 16618528
#对于字符串类型的拷贝,拷贝前后id一样,说明该拷贝的内存地址是一样的。
list拷贝
例如:n1 = [1,2,'a','b',]
n2 = copy.copy(n1)
print(id(n1))
print(id(n2))
>>> 18118472
>>> 27291208
print(id(n1[1]))
print(id(n2[1]))
>>> 1356857840
>>> 1356857840
#该拷贝说明两个列表指向的内存地址并不是一样的,单元素指向的内存地址仍然是一样的。
例如:n1 = [1,2,'a','b',[1,3,5]]
n2 = copy.copy(n1)
print(id(n1[-1]))
print(id(n2[-1]))
>>> 27291400
>>> 27291400
#拷贝前后列表元素中的列表指向内存地址是一样的。说明拷贝列表的时候,元素中如果是列表,则列表不进行拷贝,直接引用拷贝前列表中的内存地址。
例如:n1 = [1,2,'a','b',[1,3,5],(2,4,6)]
n2 = copy.copy(n1)
print(id(n1[-1]))
print(id(n2[-1]))
>>> 26827872
>>> 26827872
#对于浅拷贝,当列表中的元素为列表或者元祖等对象时,都是直接引用拷贝前该对象的内存地址。
tuple拷贝
例如:n1 = (1,2,'a','b',)
n2 = copy.copy(n1)
print(id(n1))
print(id(n2))
>>> 26736424
>>> 26736424
#拷贝前后两个元祖的内存地址是一样,说明拷贝元祖时,是直接引用拷贝前元祖的内存地址。
例如:n1 = (1,2,'a','b',(1,3,5))
n2 = copy.copy(n1)
print(id(n1[-1]))
print(id(n2[-1]))
>>> 26827872
>>> 26827872
#当有元祖的元素为元祖时,在拷贝时,也是直接引用拷贝前元祖中元素的内存地址。
dict拷贝
例如:n1 = {'k1':'v1','k2':'v2'}
n2 = copy.copy(n1)
print(id(n1))
print(id(n2))
>>> 16773512
>>> 19730504
#拷贝字典时,拷贝前后的内存地址不一样,说明字典的拷贝并不是直接引用拷贝前的内存地址。
例如:n1 = {'k1':'v1','k2':'v2','k3':{'kx1':'vx1','kx2':'vx2'}}
n2 = copy.copy(n1)
print(id(n1['k3']))
print(id(n2['k3']))
>>> 19730504
>>> 19730504
#当字典中的key对于的value为字典时,进行浅拷贝时,直接引用其拷贝前的内存地址。
set拷贝
例如:n1 = {1,2,'a','b'}
n2 = copy.copy(n1)
print(id(n1))
print(id(n2))
>>> 18151016
>>> 18150792
#集合的浅拷贝,拷贝前后的内存地址并不是一样的。
collections.Counter拷贝
由于字典计数器是对字典的扩展,而且返回值仍是一个字典,因此该对象的浅拷贝,参考字典的浅拷贝即可。
collections.OrderedDict拷贝
由于有序字典也是对字典的扩展,但该返回值为列表,因此该对象的浅拷贝,参考列表浅拷贝的第三种例子即可。
collections.defaultdict拷贝
由于默认字典也是对字典的扩展,而且返回值属于字典类型,因此该对象的浅拷贝,参考字典的浅拷贝即可。
collections.namedtuple拷贝
由于可命名元祖是对元祖的扩展,但返回值属于元祖类型,因此该对象的浅拷贝,参考元祖的浅拷贝即可。
collections.deque拷贝
由于双向队列返回值属于列表类型,因此该对象的浅拷贝,参考列表的浅拷贝即可。
2.深拷贝
创建
格式:copy.deepcopy(x,memo=None)
例如:n1 = 123
print(copy.deepcopy(n1))
>>> 123
返回值:obj
#深拷贝的创建只能调用copy模块来执行。
int拷贝
例如:n1 = 123
n2 = copy.deepcopy(n1)
print(id(n1))
print(id(n2))
>>> 1356861712
>>> 1356861712
#对于数值类型的拷贝,拷贝前后id一样,说明该拷贝的内存地址是一样的。
str拷贝
例如:n1 = 'abc'
n2 = copy.deepcopy(n1)
print(id(n1))
print(id(n1))
>>> 16618528
>>> 16618528
#对于字符串类型的拷贝,拷贝前后id一样,说明该拷贝的内存地址是一样的。
list拷贝
例如:n1 = [1,2,'a','b',]
n2 = copy.deepcopy(n1)
print(id(n1))
print(id(n2))
>>> 27291336
>>> 27276808
print(id(n1[1]))
print(id(n2[1]))
>>> 1356857840
>>> 1356857840
#该拷贝说明两个列表指向的内存地址并不是一样的,单元素指向的内存地址仍然是一样的。
例如:n1 = [1,2,'a','b',[1,3,5]]
n2 = copy.deepcopy(n1)
print(id(n1[-1]))
print(id(n2[-1]))
>>> 27291464
>>> 27291272
#拷贝前后列表元素中的列表指向内存地址也是不一样的。说明拷贝列表的时候,元素中如果是列表,则列表也进行拷贝,不再引用拷贝前列表中的内存地址。
例如:n1 = [1,2,'a','b',[1,3,5],(2,4,6)]
n2 = copy.deepcopy(n1)
print(id(n1[-1]))
print(id(n2[-1]))
>>> 26827872
>>> 26827872
#对于深拷贝,拷贝对象为元祖时,都是直接引用拷贝前的内存地址。
tuple拷贝
例如:n1 = (1,2,'a','b',)
n2 = copy.deepcopy(n1)
print(id(n1))
print(id(n2))
>>> 26736424
>>> 26736424
#拷贝前后两个元祖的内存地址是一样,说明拷贝元祖时,是直接引用拷贝前元祖的内存地址。
例如:n1 = (1,2,'a','b',(1,3,5))
n2 = copy.deepcopy(n1)
print(id(n1[-1]))
print(id(n2[-1]))
>>> 26827872
>>> 26827872
#当有元祖的元素为元祖时,在拷贝时,也是直接引用拷贝前元祖中元素的内存地址。
注:由于在python中数值、字符串和元祖,属于不可改变的对象,因此在深浅拷贝中,都是直接引用拷贝前的内存地址,并非重新开辟一块内存地址。
dict拷贝
例如:n1 = {'k1':'v1','k2':'v2'}
n2 = copy.deepcopy(n1)
print(id(n1))
print(id(n2))
>>> 16773512
>>> 27253512
#拷贝字典时,拷贝前后的内存地址不一样,说明字典的拷贝并不是直接引用拷贝前的内存地址。
例如:n1 = {'k1':'v1','k2':'v2','k3':{'kx1':'vx1','kx2':'vx2'}}
n2 = copy.deepcopy(n1)
print(id(n1['k3']))
print(id(n2['k3']))
>>> 19730504
>>> 26819016
#深拷贝中,当字典中key对应的value为字典时,进行拷贝时,并不是直接引用其拷贝前的内存地址。
set拷贝
例如:n1 = {1,2,'a','b'}
n2 = copy.deepcopy(n1)
print(id(n1))
print(id(n2))
>>> 18151016
>>> 27225672
#集合的深拷贝,拷贝前后的内存地址并不是一样的。
注:由于集合中不能包含集合,这里不再多举例说明。
collections.Counter拷贝
由于字典计数器是对字典的扩展,而且返回值仍是一个字典,因此该对象的深拷贝,参考字典的深拷贝即可。
collections.OrderedDict拷贝
由于有序字典也是对字典的扩展,但该返回值为列表,因此该对象的深拷贝,参考列表浅拷贝的第三种例子即可。
collections.defaultdict拷贝
由于默认字典也是对字典的扩展,而且返回值属于字典类型,因此该对象的深拷贝,参考字典的深拷贝即可。
collections.namedtuple拷贝
由于可命名元祖是对元祖的扩展,但返回值属于元祖类型,因此该对象的深拷贝,参考元祖的深拷贝即可。
collections.deque拷贝
由于双向队列返回值属于列表类型,因此该对象的深拷贝,参考列表的深拷贝即可。
注:由于queue模块中的Queue单项队列没有copy功能,因此这里不作介绍。
Python中模块之copy的功能介绍的更多相关文章
- Python中模块之os的功能介绍
Python中模块之os的功能介绍 1. os的变量 path 模块路径 方法:os.path 返回值:module 例如:print(os.path) >>> <module ...
- Python中模块之queue的功能介绍
模块之queue的功能介绍 队列的分类: 队列主要要分为两种 1.双向队列 2.单项队列 1. 单项队列 创建单项队列 格式:queue.Queue(obj) 例如:que = queue.Queue ...
- Python中模块之sys的功能介绍
sys模块的功能介绍 1. sys的变量 argv 命令行参数 方法:sys.argv 返回值:list 例如:test1.py文件中有两句语句1.import sys 2.print(sys.arg ...
- Python中模块之re的功能介绍
re模块的功能介绍 1. 方法 match 从开头开始查找 方法:re.match(pattern,string,flags=0) 返回值:<class '_sre.SRE_Match'> ...
- Python中模块之random的功能介绍
random的功能介绍 random模块的方法如下: betavariate 获取一个range(0,1)之前的随机浮点数 方法:random.betavariate(alpha,beta) 返回值: ...
- Python中生成器和迭代器的功能介绍
生成器和迭代器的功能介绍 1. 生成器(generator) 1. 赋值生成器 1. 创建 方法:x = (variable for variable in iterable) 例如:x = (i f ...
- Python中def及lambda的功能介绍
函数def及lambda的功能介绍 1. def函数的功能介绍 1. 函数的参数 无参数函数 格式:def func_name(): '''__doc__'''#函数的说明文档(内容) express ...
- 查看python中模块的所有方法
查看python中模块的所有方法 安装的python模块,现将查看方法总结如下 一.CMD命令行下使用pydoc命令 在命令行下运行$ pydoc modules即可查看 二.在python交 ...
- [python]关于在python中模块导入问题追加总结
[背景] 最近在写程序时,我使用的eclipse编辑器运行都没有问题,然后部署到自动化环境上却偏偏报找不到相应模块问题,现在对该问题在之前的贴子上追加总结 原帖子:[python]关于python中模 ...
随机推荐
- 部分和问题 nyoj
部分和问题 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 给定整数a1.a2........an,判断是否可以从中选出若干数,使它们的和恰好为K. 输入 首先, ...
- 第二章 Idea搭建maven
第二章 Idea搭建maven 1.配置Maven的环境变量 a.首先我们去maven官网下载Maven程序,解压到安装目录,如图所示: b.配置M2_HOME(MAVEN_HOME)的环境变量,然后 ...
- python 鸭子类型
首先Python不支持多态,也不用支持多态,python是一种多态语言,崇尚鸭子类型. 在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格.在这种风格中,一个对象有效的语义,不 ...
- 文本分类学习(三) 特征权重(TF/IDF)和特征提取
上一篇中,主要说的就是词袋模型.回顾一下,在进行文本分类之前,我们需要把待分类文本先用词袋模型进行文本表示.首先是将训练集中的所有单词经过去停用词之后组合成一个词袋,或者叫做字典,实际上一个维度很大的 ...
- Android P专区免费开放 -- 同样的Android,不同的体验
2018年3月8日,Google推出了Android P Preview版本,并提供官方镜像下载. 为了让广大开发者能够及时了解Android P的新功能特性,提前为您的app进行良好适配,WeTes ...
- RxJava系列6(从微观角度解读RxJava源码)
RxJava系列1(简介) RxJava系列2(基本概念及使用介绍) RxJava系列3(转换操作符) RxJava系列4(过滤操作符) RxJava系列5(组合操作符) RxJava系列6(从微观角 ...
- Windows10下的docker安装与入门 (一)使用docker toolbox安装docker
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何 ...
- urllib.parse.urlencode
urllib.request.urlopen(url,data,timeout) 其中如果data被赋值,则请求的方式就会由get转为post,而post需要提供一些待处理的数据. 这些待处理的数据需 ...
- SQL Server 2014 HADR_DATABASE_WAIT_FOR_TRANSITION_TO_VERSIONING 等待
最近有发现SAP 的MES系统上了AlwaysOn后辅助节点发现无法查询的情况,例如在辅助节点上执行: SELECT TOP 0 * FROM TABLE1; 语句执行正常SELECT TOP 1* ...
- NodeJS技巧
1. 获取程序执行时间 // 打印程序执行时间 console.time() // some functions console.timeEnd() 2. 将函数异步化 setTimeout(() = ...