Python中浅拷贝和深拷贝的区别

浅拷贝和深拷贝示意图

如上图,简单点说

1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象。

2. copy.deepcopy 深拷贝 拷贝对象及其子对象

数字,字符串是不可变类型

列表,字典是可变类型

我们看下面的案例

案例一:浅拷贝>>> import copy

#导入copy模块

>>> s=['name',['savings',100.0]]

#赋值给s

>>> t=copy.copy(s)

#将s浅拷贝给t

>>> s

['name', ['savings', 100.0]]

>>> t

['name', ['savings', 100.0]]

>>> id(s)

139814645224224

>>> id(t)

139814645264184

#查看s和t的内存空间地址,发现s和t的内存空间地址不一样

>>> id(s[0])

139814648512112

>>> id(t[0])

139814648512112

>>> id(s[1])

139946237132672

>>> id(t[1])

139946237132672

#查看s和t的子对象的内存空间地址,发现s和t的子对象的内存空间地址一样

#以上证明浅拷贝只拷贝父对象,不会拷贝对象的内部的子对象

>>> s.append('age')

>>> s

['name', ['savings', 100.0], 'age']

>>> t

['name', ['savings', 100.0]]

#s添加'age'字符串,但是t并没有添加

>>> s[0]='job'

>>> s

['job', ['savings', 100.0], 'age']

>>> t

['name', ['savings', 100.0]]

>>> s[1][1]=200.0

>>> s

['job', ['savings', 200.0], 'age']

>>> t

['name', ['savings', 200.0]]

#当我们修改s的'name'时t并没有修改,但是当我修改s的100.0时t也被修改了

#数字、字符串是不可变类型,t并不会跟着s一起被修改

#列表,字典为可变类型,t会随s的修改而被修改,100.0是属于s里的列表的值

案例二:深拷贝>>> import copy

#导入copy模块

>>> s=['name',['savings',100.0]]

#赋值给s

>>> t=copy.deepcopy(s)

#将s浅拷贝给t

>>> s

['name', ['savings', 100.0]]

>>> t

['name', ['savings', 100.0]]

#查看s和t的值

>>> id(s)

140329642791784

>>> id(t)

140329642793080

#查看s和t的内存空间地址,发现s和t的内存空间地址不一样

>>> id(s[0])

140329646079600

>>> id(t[0])

140329646079600

#查看s和t的子对象'name'的内存空间地址,发现s和t的子对象'name'的内存空间地址一样

>>> id(s[1])

140329642729344

>>> id(t[1])

140329642831240

#查看s和t的子对象['savings',100.0]的内存空间地址,发现s和t的子对象['savings',100.0]的内存空间地址不一样

#以上证明深拷贝会拷贝对象及其子对象

>>> s.append('age')

>>> s

['name', ['savings', 100.0], 'age']

>>> t

['name', ['savings', 100.0]]

#s添加'age'字符串,但是t并没有添加

>>> s[0]='job'

>>> s

['job', ['savings', 100.0]]

>>> t

['name', ['savings', 100.0]]

>>> s[1][1]=200.0

>>> s

['name', ['savings', 200.0], 'age']

>>> t

['name', ['savings', 100.0]]

#当我们修改s的'name'时t没有被修改,但是当我修改s的100.0时t也没被修改

#证明s和t是完全分离开来的,没有任何关联

总结:

浅拷贝时,当我们修改s的子对象(字典和列表等可变类型)时,t也会跟着改变。但是s添加对象时,t并不会添加

深拷贝时,s和t的内容完全分离开来,添加或修改s的对象时t并不会跟着改变

python中浅拷贝和深拷贝的区别_Python中浅拷贝和深拷贝的区别相关推荐

  1. python中copy和deepcopy的区别_python里shadowcopy和deepcopy的区别

    python中,经常会需要拷贝特定对象,在此可能就会遇到各种bug,原因就是明白这三种操作的区别,赋值,浅拷贝,深拷贝. 赋值(=),浅拷贝(copy)和深拷贝(deepcopy)比较容易区别开的是赋 ...

  2. python属性和方法的区别_Python中几种属性访问的区别

    起步 python的提供一系列和属性访问有关的特殊方法:__get__, __getattr__, __getattribute__, __getitem__ .本文阐述它们的区别和用法. 属性的访问 ...

  3. python属性和方法的区别_Python中几种属性访问的区别与用法详解

    起步 在Python中,对于一个对象的属性访问,我们一般采用的是点(.)属性运算符进行操作.例如,有一个类实例对象foo,它有一个name属性,那便可以使用foo.name对此属性进行访问.一般而言, ...

  4. python中的字典和类的区别_Python中的 字典和字典数据类型

    字典 1.字典是Python的内建数据类型,我们知道序列是以连续的整数为索引,而字典用关键字作为索引.特别的,关键字必须是不可变类型,常为字符串或者数值. #如果元组中只包含字符串和数字,它可以作为关 ...

  5. python新式类和经典类区别_Python中新式类和经典类的区别,钻石继承

    1)首先,写法不一样: class A: pass class B(object): 2)在多继承中,新式类采用广度优先搜索,而旧式类是采用深度优先搜索. 3)新式类更符合OOP编程思想,统一了pyt ...

  6. python中find和findall区别_python中re的finditer与findall有什么不同

    python中re的finditer与findall有什么不同 发布时间:2020-11-16 14:06:18 来源:亿速云 阅读:72 作者:Leah python中re的finditer与fin ...

  7. python中字典和集合的区别_Python中字典和集合学习小结

    映射类型: 表示一个任意对象的集合,且可以通过另一个几乎是任意键值的集合进行索引 与序列不同,映射是无序的,通过键进行索引 任何不可变对象都可用作字典的键,如字符串.数字.元组等 包含可变对象的列表. ...

  8. python交互式和文件式区别_Python中的交互式数据可视化与Bokeh(系列五)

    使用图例突出显示数据 这将我们带到本教程中的最终交互性示例:交互式图例. 在" 使用字形绘制数据"部分中,您了解了在创建绘图时实现图例是多么容易.有了这个传奇,增加交互性只是分配一 ...

  9. python 变量赋值是引用和拷贝_Python 中变量赋值传递时的引用和拷贝

    曾经看到这样一个问题,一个字典中的元素是列表,将这个列表元素赋值给一个变量,然后修改这个列表中元素的值,结果发现,字典中那个列表也同样修改了.那个问题如下: dict = {'a':[1,2,3,4, ...

  10. python list tuple区别_Python list、tuple、dict区别

    Dictionary 是 Python 的内置数据类型之一, 它定义了键和值之间一对一的关系. 每一个元素都是一个 key-value 对, 整个元素集合用大括号括起来 您可以通过 key 来引用其值 ...

最新文章

  1. vim 打造属于自己的 IDE
  2. boost::mp11::mp_partial_sum相关用法的测试程序
  3. 收集的安全网站【公司】
  4. 在线安装TIDB集群
  5. What?一个 Dubbo 服务启动要两个小时!
  6. BZOJ4061/Gym100624F CERC2012 Farm and Factory 最短路、切比雪夫距离
  7. .Net Excel 部分操作
  8. 3月初的日记:网站工作记录
  9. 阿里技术专家加多:Java异步编程实战之基于JDK中的Future实现异步编程
  10. 为什么rocketmq的queue分为读写?_分布式发布订阅消息系统Kafka 为什么快
  11. [py]flask从0到1-模板/增删改查
  12. 【详细】遍历Windows文件
  13. C语言编程入门——程序练习(下)
  14. 2022年电工杯B题应急物资配送问题浅析
  15. win32 API 调用方法
  16. 分享两个完整javaweb项目源码
  17. GPG软件签名与验证
  18. 微博文摘——女人与ITIL
  19. C语言程序static改错题,2014计算机二级C语言程序设计全真测试题
  20. kafak集群python外网无法访问:kafka.errors.NoBrokersAvailable: NoBrokersAvailable

热门文章

  1. 导出dhcp服务器配置信息的命令,用于导出和导入 DHCP 范围的 Netsh 实用工具 - Windows Server | Microsoft Docs...
  2. 有什么商务蓝牙耳机推荐?盘点四款通话清晰的商务蓝牙耳机
  3. PHP网站开发技术期末作品,PHP网站开发技术.ppt
  4. oneforall安装和简单使用
  5. 狂涨结束:内存和固态硬盘终于要降价了
  6. 美通社母公司Cision发布《2023全球媒体调查报告》
  7. 神经网络算法实例说明,简单神经网络算法原理
  8. selenium解决验证码的方法
  9. Dubbo支持哪些协议?各有什么特点?
  10. vb.net 教程 1-14 Hashtable 和 Dictionary比较