一直对python深copy和浅copy似懂非懂的状态,看了这篇文章,觉得自己懂了很多,给各位参考!

出处:https://www.cnblogs.com/fandx/p/10462913.html


单层浅拷贝

import copy
a = 1  # 不可变数据类型
copy_a = copy.copy(a)
print(id(a),id(copy_a))  # 内存地址相同a = [1,2]  # 可变数据类型
copy_a = copy.copy(a)
print(id(a),id(copy_a))  # 内存地址不相同

单层深拷贝

import copy
a = 1  # 不可变数据类型
copy_a = copy.deepcopy(a)
print(id(a),id(copy_a))  # 内存地址相同a = [1,2]  # 可变数据类型
copy_a = copy.deepcopy(a)
print(id(a),id(copy_a))  # 内存地址不相同

结论一:

不管深拷贝还是浅拷贝对不可变数据类型都是引用内存地址

不管深拷贝还是浅拷贝对可变数据类型都是会重新创建新的内存空间

浅拷贝嵌套

# -----------不可变数据类型---------
# 情况一,内嵌可变数据类型
import copy
a = ([1,2],(3,4))  # 不可变数据类型
copy_a = copy.copy(a)
print(id(a),id(copy_a))  # 内存地址相同
# 情况二,内嵌不可变数据类型
a = ((1,2),(3,4))  # 不可变数据类型
copy_a = copy.copy(a)
print(id(a),id(copy_a))  # 内存地址相同#-----------可变数据类型-------------
# 情况一,内嵌可变数据类型
import copy
a = [(1,2),[3,4]]  # 可变数据类型
copy_a = copy.copy(a)
print(id(a),id(copy_a))  # 内存地址不相同# 情况一, 可变数据类型 内嵌可变数据类型
import copy
a = [(1,2),(3,4)]  # 可变数据类型
copy_a = copy.copy(a)
print(id(a),id(copy_a))  # 内存地址不相同

深拷贝嵌套

# -----------不可变数据类型---------
# 情况一,内嵌可变数据类型
import copy
a = ([1,2],(3,4))  # 不可变数据类型
copy_a = copy.deepcopy(a)
print(id(a),id(copy_a))  # 内存地址不相同
# 情况二,内嵌不可变数据类型
a = ((1,2),(3,4))  # 不可变数据类型
copy_a = copy.deepcopy(a)
print(id(a),id(copy_a))  # 内存地址相同#-----------可变数据类型-------------
# 情况一,内嵌可变数据类型
import copy
a = [(1,2),[3,4]]  # 可变数据类型
copy_a = copy.deepcopy(a)
print(id(a),id(copy_a))  # 内存地址不相同
print(id(a[0]),id(copy_a[0]))  # 内存地址相同
print(id(a[1]),id(copy_a[1]))  # 内存地址不相同# 情况一, 可变数据类型 内嵌可变数据类型
import copy
a = [(1,2),(3,4)]  # 可变数据类型
copy_a = copy.deepcopy(a)
print(id(a),id(copy_a))  # 内存地址不相同
print(id(a[0]),id(copy_a[0]))  # 内存地址相同

结论二:

浅拷贝:

  1. 外层是不可变类型、不管内层是否可变都是引用拷贝
  2. 外层是可变类型,不管内层是否可变都会从新创建新的内存空间

深拷贝:

  1. 外层是不可变类型,会递归判断内层数据类型、如果可变则创建新的内存地址、都为不可变就是引用拷贝
  2. 外层是可变数据类型、不管内层是否可变都会创新新的内存地址、但是内部如果为可变则递归创建、不可变则为引用地址

总结:

浅拷贝:

  1. 浅拷贝只做最顶层的数据类型判断
  2. 如果顶层是可变类型则创建新的内存空间
  3. 如果顶层是不可变数据类型就是引用拷贝

深拷贝

  1. 深拷贝做递归拷贝,可以递归拷贝所有的内部嵌套数据(可以理解为循环遍历做浅拷贝判断)
  2. 深拷贝递归拷贝遇到可变类型则创建新的内存空间
  3. 深拷贝递归拷贝遇到不可变数据类型就是拷贝的引用

关于python深copy与浅copy的一点理解相关推荐

  1. python 深copy_python中的深copy和浅copy

    bytes Python bytes/str bytes 在Python3中作为一种单独的数据类型,不能拼接,不能拼接,不能拼接 >>> '€20'.encode('utf-8') ...

  2. python 3列表推导式的的一点理解!

    python 3列表推导式的的一点理解! Python的列表推导式对于新手来说一般都难以理解,简单看个例子: [x * x for x in range(1,100)] 上面是一个很简单的列表推导式, ...

  3. Python的深copy和浅copy

    浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象. 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象. 浅copy: a = [1, 2, ...

  4. 深copy 和 浅copy 解析

    浅copy 对于引用类型(数组.类对象),copy 的是引用,这就会导致如果你修改copy 过来的对象进行修改,就会影响原来的对象. 深copy 就是把所有的引用对象都实现 cloneable 方法, ...

  5. python深复制与浅复制_Python中的深拷贝和浅拷贝详解

    要说清楚Python中的深浅拷贝,需要搞清楚下面一系列概念: 变量-引用-对象(可变对象,不可变对象)-切片-拷贝(浅拷贝,深拷贝) [变量-对象-引用] 在Python中一切都是对象,比如说:3, ...

  6. IOS学习笔记十八(copy、mutableCopy、NSCopying、NSMutableCopy、深复制、浅复制)

    1. copy.mutableCopy方法 copy方法返回对象的不可修改的副本 mutableCopy方法返回的对象可修改的副本 1).测试demo int main(int argc, char ...

  7. python教程:深copy浅copy

    在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用. 1. 赋值 赋值其实只是传递对象引用,引用对象 ...

  8. 个人对 Python 数据类型理解整理所得 以及深/浅copy

    将python数据类型进行分类: 可更改数据类型:list(列表)  dict(字典)  set(集合) 可更改数据类型:int(整型)  str(字符串)  bool(布尔型)  tuple(元组) ...

  9. Python学习日记(六) 浅深copy

    浅深copy即完全复制一份和部分复制一份 浅深copy在列表数据量较大时不建议使用,比较消耗内存资源 1.赋值运算 l1 = [1,'s',[1,2,3]] l2 = l1 print(id(l1), ...

最新文章

  1. php留言板只能留言一次,php如何实现留言板修改留言
  2. Flume(NG)架构设计要点及配置实践
  3. Web开发(一)·期末不挂之第三章·HTML基础二(html实现表格和表单)
  4. java impala_impala 概述
  5. 碰撞的小球 ccf (模拟)
  6. python中backward_pytorch的梯度计算以及backward方法详解
  7. github不支持html,为什么Github页面不允许我有效的HTML?
  8. 操作系统 第五章 IO管理
  9. 电脑强制打开手机usb调试_手机、电脑录屏的5种正确打开方式,简直太快了!网友:实用...
  10. Git基础入门(一)Git基础概念
  11. python面试题汇总_【Python环境】Python面试题汇总(一)
  12. GoLand添加一个已有项目的相关配置
  13. 山东大学2022软件测试技术复习纲要
  14. Excel表格匹配合并
  15. nyoj 712 探 寻 宝 藏(双线dp 第六届河南省程序设计大赛)
  16. 大数据剖析 | 薪资没那么高,延毕率超60%,现代人读博都图什么?
  17. ROSERROR : The root link_base has an inertia specified in the URDF, but KDL does not support ...
  18. EditPlus中编译运行c#文件
  19. python海洋绘图-Basemap库画地图时,南极洲显示不全
  20. read_csv()报错: 'utf-8' codec can't decode byte 0xca in position 0: invalid continuation byte最新解决办法

热门文章

  1. 算法乐趣--三只水桶等分水问题
  2. 三个水桶等分8升水的问题 -《算法的乐趣》
  3. c语言杨辉三角解释,C语言杨辉三角是什么
  4. 群辉显示你没有权限使用此服务器,禁止您无权访问此服务器上的/
  5. 软件生存周期的过程,活动和任务
  6. 读后感:移动时代,一个正在进行的伟大时代!---《移动浪潮》读后感
  7. guava 缓存过期策略
  8. 【八芒星计划】 劫持_IO_2_1_stdout_泄露libc
  9. keystore相关问题
  10. 恶补高中计算机基础(人教版)重点总结--机房里写过的高考作业变成了现在要背的概念