在总结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模块(浅复制和深复制)相关推荐

  1. python浅复制与深复制_Python中的浅复制与深复制

    python浅复制与深复制 In python, the assignment operator does not copy the objects, instead, they create bin ...

  2. 详解Python中的浅复制与深复制

    列表对象的copy()方法返回列表的浅复制.所谓浅复制,是指生产一个新的列表,并且把原列表中所有元素的引用都复制到新列表中.如果原列表中只包含整数.实数.复数等基本类型或元组.字符串这样的不可变类型, ...

  3. 深入理解python中的select模块

    简介 Python中的select模块专注于I/O多路复用,提供了select poll epoll三个方法(其中后两个在Linux中可用,windows仅支持select),另外也提供了kqueue ...

  4. Python中的常用模块

    1.sys模块(内置模块) 在sys模块中定义了一些函数和变量,用来设置和获取系统的信息. # Python中的常用模块:sys模块 import sys sys.path.append('./tes ...

  5. python select模块_深入理解python中的select模块

    简介 Python中的select模块专注于I/O多路复用,提供了select  poll  epoll三个方法(其中后两个在Linux中可用,windows仅支持select),另外也提供了kque ...

  6. python中的numpy模块

    参考  python中的numpy模块 - 云+社区 - 腾讯云 目录 NumPy 教程 学习本教程前你需要了解 NumPy 应用 相关链接 NumPy 安装 1.使用已有的发行版本 2.使用 pip ...

  7. cx_oracle主备服务器,怎么在Python中使用cx_Oracle模块对Oracle数据库进行操作

    怎么在Python中使用cx_Oracle模块对Oracle数据库进行操作 发布时间:2021-03-17 16:32:34 来源:亿速云 阅读:67 作者:Leah 本篇文章为大家展示了怎么在Pyt ...

  8. Python 中 concurrent.futures 模块使用说明

    Python 中 concurrent.futures 模块使用说明 转载请注明出处:https://blog.csdn.net/jpch89/article/details/87643972 文章目 ...

  9. python中 xlrd/xlwt模块详解

    python中 xlrd/xlwt模块详解 1.什么是xlrd模块 python操作excel主要用到xlrd和xlwt两个库,即xlrd是读excel,xlwt是写excel库 一.安装xlrd模块 ...

最新文章

  1. 学了python能干啥-第9p,Python是什么?学了Python能干什么?
  2. 大家一起来博皮——2:液态布局和固态布局,页面框架篇
  3. 似然函数代码c语言,从似然函数到EM算法(附代码实现)
  4. c hello world_世界上最难的 5 种编程语言!C/C++竟不在其列,它们到底是谁?
  5. xclock 不出来界面_macOS 使用 XQuartz 支持 X11 实现 Linux 图形化界面显示
  6. 静态变量不能跨函数使用
  7. ionic 幻灯指令 ion-slide-box
  8. C++矩阵加速经典题目:Warcraft III 守望者的烦恼 [vijos 1067]
  9. 图示电路中的等效电阻rab_例1求图示电路的等效电阻rab.ppt
  10. 阿里巴巴副总裁陈丽娟:我对阿里云产品生态的思考
  11. 知识分享 | IEC FMEA手册 附录A.1摘录
  12. python+nodejs+vue大学生心理健康测评管理系统
  13. win10专业版本激活
  14. 当360屠榜黑客奥斯卡,我们为什么要关注国家级网络安全战?
  15. Robust continuous clustering
  16. MySQL下载压缩包安装详细过程
  17. 360路由器外网映射
  18. 电子工程师必备的调试神器—H7-TOOL
  19. 万字长文详解 Go 程序是怎样跑起来的?| CSDN 博文精选
  20. 基于有序二叉树的专家系统应用——动物游戏(C++)

热门文章

  1. 用Python告诉你,为什么宇宙的尽头是公务员!
  2. VM虚拟机里怎么安装ubuntu-16.04.5-desktop-amd64.iso
  3. 效果直逼flash的Div+Css+Js菜单
  4. 为ASP.NET控件加入快捷菜单
  5. 小米超大杯旗舰不叫12 Ultra:或命名为MIX 5 Pro
  6. iPhone 13系列电池容量最高4350mAh 较iPhone 12提升近20%
  7. 比尔 · 盖茨即将在美国商会发表演讲 系离婚后首次亮相
  8. 索尼PS5国行版本周开售 后期将推全配色DualSense手柄
  9. 黑鲨或将在明天公布黑鲨4系列游戏手机
  10. 特斯拉股价周五收盘下跌7.38% 此前公布第三季度交付量创新高