python中的copy模块(浅复制和深复制)
在总结copy模块中的浅复制(copy)和深复制(deepcopy)前,先对“引用”做下说明:
引用是指保存的值为对象的地址。在 Python 语言中,一个变量保存的值除了基本类型保存的是值外,其它都是引用,因此对于它们的使用就需要小心一些。下面举个例子:
问题描述:已知一个列表,求生成一个新的列表,列表元素是原列表的复制。
a=[1,2]
b=a
这种做法其实并未真正生成一个新的列表,b指向的仍然是a所指向的对象。这样,如果对a或b的元素进行修改,a,b的值同时发生变化。
a=[1,2]
b=a[:]
这样修改a对b没有影响。修改b对a没有影响。
但 这种方法只适用于简单列表,也就是列表中的元素都是基本类型,如果列表元素还存在列表的话,这种方法就不适用了。原因就是,象a[:]这种处理,只是将列 表元素的值生成一个新的列表,如果列表元素也是一个列表,如:a=[1,[2]],那么这种复制对于元素[2]的处理只是复制[2]的引用,而并未生成[2]的一个新的列表复制。为了证明这一点,测试步骤如下:
>>> a=[1,[2]]
>>> b=a[:]
>>> b
[1, [2]]
>>>a[1].append(3)
>>> a
[1, [2, 3]]
>>> b
[1, [2, 3]]
可见,对a的修改影响到了b。如果解决这一问题,可以使用copy模块中的deepcopy函数。修改测试如下:
>>> import copy
>>>a=[1,[2]]
>>>b=copy.deepcopy(a)
>>> b
[1, [2]]
>>>a[1].append(3)
>>> a
[1, [2, 3]]
>>> b
[1, [2]]
########
copy(x)潜复制
########
创建新的复合对象并通过引用复制x的成员来创建x的潜复制,它复制了对象,但对于对象中的元素,依然使用引用。对于内置类型,此函数并不经常使用。而是使用诸如list(x), dict(x), set(x)等调用方式来创建x的浅复制,要知道像这样直接使用类型名显然比使用copy()快很多。但是它们达到的效果是一样的。
判断对象之间是否是拷贝,可以用下面方法:
a is b ->True a与b引用的是同一个对象,不是拷贝;
-> False a与b是彼此拷贝对象;
引出例子来说明:
(1)
>>> a = [1,2,3]
>>> b = copy.copy(a)
>>> b
[1, 2, 3]
>>> a.append(4)
>>> a
[1, 2, 3, 4]
>>> b
[1, 2, 3]
>>> a is b
False
(2)
>>> a = [1,2,3]
>>> b = a
>>> b
[1, 2, 3]
>>> a.append(4)
>>> a
[1, 2, 3, 4]
>>> b
[1, 2, 3, 4]
>>> b.append(6)
>>> a, b
([1, 2, 3, 4, 6], [1, 2, 3, 4, 6])
(3)
>>> a = [1,2,3]
>>> b = list(a)
>>> b
[1, 2, 3]
>>> a.append(4)
>>> a
[1, 2, 3, 4]
>>> b
[1, 2, 3]
>>> (相当于b=copy(a))
(4)
>>> a = [[1], ['a'], ['A']]
>>> b = copy.copy(a)
>>> print a, b
[[1], ['a'], ['A']] [[1], ['a'], ['A']]
>>> b[1].append('b')
>>> b
[[1], ['a', 'b'], ['A']]
>>> a
[[1], ['a', 'b'], ['A']]
>>> b.append([100,101])
>>> b
[[1], ['a', 'b'], ['A'], [100, 101]]
>>> a
[[1], ['a', 'b'], ['A']]
############
deepcopy()函数
###############
完全的拷贝一个对象和一个对象的所有元素的值, 通过创建新的复合对象并重复复制x的所有成员来创建x的深复制。
eg:
>>> a = [[1], ['a'], ['A']]
>>> import copy
>>> b = copy.deepcopy(a)
>>> b
[[1], ['a'], ['A']]
>>> c = copy.copy(a)
>>> c
[[1], ['a'], ['A']]
>>> a[1].append('b')
>>> a
[[1], ['a', 'b'], ['A']]
>>> b
[[1], ['a'], ['A']]
>>> c
[[1], ['a', 'b'], ['A']]
python中的copy模块(浅复制和深复制)相关推荐
- python浅复制与深复制_Python中的浅复制与深复制
python浅复制与深复制 In python, the assignment operator does not copy the objects, instead, they create bin ...
- 详解Python中的浅复制与深复制
列表对象的copy()方法返回列表的浅复制.所谓浅复制,是指生产一个新的列表,并且把原列表中所有元素的引用都复制到新列表中.如果原列表中只包含整数.实数.复数等基本类型或元组.字符串这样的不可变类型, ...
- 深入理解python中的select模块
简介 Python中的select模块专注于I/O多路复用,提供了select poll epoll三个方法(其中后两个在Linux中可用,windows仅支持select),另外也提供了kqueue ...
- Python中的常用模块
1.sys模块(内置模块) 在sys模块中定义了一些函数和变量,用来设置和获取系统的信息. # Python中的常用模块:sys模块 import sys sys.path.append('./tes ...
- python select模块_深入理解python中的select模块
简介 Python中的select模块专注于I/O多路复用,提供了select poll epoll三个方法(其中后两个在Linux中可用,windows仅支持select),另外也提供了kque ...
- python中的numpy模块
参考 python中的numpy模块 - 云+社区 - 腾讯云 目录 NumPy 教程 学习本教程前你需要了解 NumPy 应用 相关链接 NumPy 安装 1.使用已有的发行版本 2.使用 pip ...
- cx_oracle主备服务器,怎么在Python中使用cx_Oracle模块对Oracle数据库进行操作
怎么在Python中使用cx_Oracle模块对Oracle数据库进行操作 发布时间:2021-03-17 16:32:34 来源:亿速云 阅读:67 作者:Leah 本篇文章为大家展示了怎么在Pyt ...
- Python 中 concurrent.futures 模块使用说明
Python 中 concurrent.futures 模块使用说明 转载请注明出处:https://blog.csdn.net/jpch89/article/details/87643972 文章目 ...
- python中 xlrd/xlwt模块详解
python中 xlrd/xlwt模块详解 1.什么是xlrd模块 python操作excel主要用到xlrd和xlwt两个库,即xlrd是读excel,xlwt是写excel库 一.安装xlrd模块 ...
最新文章
- 学了python能干啥-第9p,Python是什么?学了Python能干什么?
- 大家一起来博皮——2:液态布局和固态布局,页面框架篇
- 似然函数代码c语言,从似然函数到EM算法(附代码实现)
- c hello world_世界上最难的 5 种编程语言!C/C++竟不在其列,它们到底是谁?
- xclock 不出来界面_macOS 使用 XQuartz 支持 X11 实现 Linux 图形化界面显示
- 静态变量不能跨函数使用
- ionic 幻灯指令 ion-slide-box
- C++矩阵加速经典题目:Warcraft III 守望者的烦恼 [vijos 1067]
- 图示电路中的等效电阻rab_例1求图示电路的等效电阻rab.ppt
- 阿里巴巴副总裁陈丽娟:我对阿里云产品生态的思考
- 知识分享 | IEC FMEA手册 附录A.1摘录
- python+nodejs+vue大学生心理健康测评管理系统
- win10专业版本激活
- 当360屠榜黑客奥斯卡,我们为什么要关注国家级网络安全战?
- Robust continuous clustering
- MySQL下载压缩包安装详细过程
- 360路由器外网映射
- 电子工程师必备的调试神器—H7-TOOL
- 万字长文详解 Go 程序是怎样跑起来的?| CSDN 博文精选
- 基于有序二叉树的专家系统应用——动物游戏(C++)
热门文章
- 用Python告诉你,为什么宇宙的尽头是公务员!
- VM虚拟机里怎么安装ubuntu-16.04.5-desktop-amd64.iso
- 效果直逼flash的Div+Css+Js菜单
- 为ASP.NET控件加入快捷菜单
- 小米超大杯旗舰不叫12 Ultra:或命名为MIX 5 Pro
- iPhone 13系列电池容量最高4350mAh 较iPhone 12提升近20%
- 比尔 · 盖茨即将在美国商会发表演讲 系离婚后首次亮相
- 索尼PS5国行版本周开售 后期将推全配色DualSense手柄
- 黑鲨或将在明天公布黑鲨4系列游戏手机
- 特斯拉股价周五收盘下跌7.38% 此前公布第三季度交付量创新高