在python里对对象进行拷贝有三个,即赋值,深拷贝,浅拷贝。而对象又分为两种,一种是不可变对象(字符串、元组、数字 ),一种是可变对象(列表、字典)。而深浅拷贝有三种情况:

  1. 拷贝的是不可变对象,对于不可变对象来说,深浅拷贝都一样的,即便是用深拷贝,也都是一样的id,如果要重新赋值,也只是创建一个新的对象,替换旧的对象。所以对于不可变对象来说,不管怎么拷贝,它的地址、值都是一样的。
  2. 拷贝的是可变对象
import copy
a=3
b=copy.copy(3)
c=copy.deepcopy(3)
print(a,b,c)  #3,3,3,
print(id(a)==id(b)==id(c))  #true
  1. 拷贝的可变对象里面还有子对象
import copy
a=[1,2,3,[4,5,6]]#1,2,3 是第一层,[4,5,6]是第二层
b=a
c=copy.copy(a)#当浅copy的时候,第一层是新的,第二层还是原来的地址
d=copy.deepcopy(a)#当用深copy的时候,所有的内容都是新的,所以不会影响地址print(id(a)==id(b))  #true
print(id(a)==id(c))  #false
print(id(a)==id(d))  #false
print(id(c)==id(d))  #false

下面用栈和堆来解释这个深浅copy。

1.下面的程序是一个简单的把赋值相等的函数

c=[1,2,3]
d=c
c[0]=100
print(c==d)     #true

用栈和堆是如下图:

这是是一个简单把c的值赋给d,就是把c在栈中存放[1,2,3,]在堆中的地址传给d。

2.浅copy的程序如下

import  copy
a=[1,2,3]
b=copy.copy(a)
a[0]=100
print(a==b)      #flase

用栈和堆的图形表示为


浅拷贝只是把【1,2,3】的值在堆里重新开辟的内存把【1,2,3,】放进去,b在栈里存放的【1,2,3】在堆里的地址和a在栈里存放的【1,2,3,】在堆里的地址是两个完全不同的地址。
a 的值得变换不回影影响b的值

如果是嵌套列表,在浅copy里,嵌套列表值改变会影响复制的值

import copy
a=[[1,2],3,4]
b=copy.copy(a)
a[0][0]=100
print(b)     #[[100,2],3,4]

用栈和堆的图示来表示的入下图:

b只是copy了【0xf001,3,4】,但是没有copy【1,2】,所以【1,2】在堆里的地址还是原地址,所以1换成100,b的值也是[[100,2],3,4]

当浅copy的时候,第一层是新的,第二层还是原来的地址。

3.深copy:

import copy
a=[1,2,[3,4]]
b=copy.deepcopy(a)
a[2][0]=300
print(a)   # [1, 2, [300, 4]]
print(b)    #[1, 2, [3, 4]]

输出结果a=[1, 2, [300, 4]], b=[1, 2, [3, 4]]
具体如下图:

当用深copy的时候,所有的地址都是新的,所以不会影响地址,所以a[2][0]的改变不会影响b[2][0]的值改变,因为堆地址完全不一样。

Python深浅copy相关推荐

  1. Python 深浅copy 和文件操作

    深浅copy 1,先看赋值运算. l1 = [1,2,3,['barry','alex']] l2 = l1l1[0] = 111 print(l1) # [111, 2, 3, ['barry', ...

  2. Python基础三--字典,集合,编码,深浅copy,元祖、文件操作

    字典 dict数据类型划分:可变数据类型,不可变数据类型不可变数据类型: 元组,bool值,int,str 可哈希可变数据类型: list,dict,set 不可哈希 dict key :必须是不可变 ...

  3. python怎么设置颜色深浅变化_Python赋值、深浅copy

    Python赋值.深浅copy assignment: 在 Python 中,对象的赋值就是简单的对象引用,这点和 C++不同,如下所示 a = [1, 2, 'hello', ['python', ...

  4. python 的内存回收,及深浅Copy详解

    一.python中的变量及引用 1.1 python中的不可变类型: 数字(num).字符串(str).元组(tuple).布尔值(bool<True,False>) 接下来我们讲完后你就 ...

  5. [转载] python创建集合、计算a|b_python之路(集合,深浅copy,基础数据补充)

    参考链接: Python 集合set | symmetric_difference 一.集合:类似列表,元组的存储数据容器,不同点是不可修改,不可重复.无序排列. 1.创建集合: (1).set1 = ...

  6. 乐学python怎么样_铁乐学Python_day07_集合and浅谈深浅copy

    1.[List补充] 在循环一个列表时,最好不要使用元素和索引进行删除操作,一旦删除,索引会随之改变,容易出错. 如果想不出错,可以采用倒着删除的方法,因为倒着删除进行的话,只是后面元素的位置发生了变 ...

  7. python之深浅copy

    python之深浅copy 文章目录 python之深浅copy 引入 1.为什么要使用深浅拷贝 一.赋值运算 1.赋值运算原理 2.示例 3.总结 二.拷贝 三.浅拷贝 什么是浅拷贝? 1.浅拷贝原 ...

  8. python拷贝文件函数_python笔记2小数据池,深浅copy,文件操作及函数初级

    小数据池就是在内存中已经开辟了一些特定的数据,经一些变量名直接指向这个内存,多个变量间公用一个内存的数据. int: -5 ~ 256 范围之内 str: 满足一定得规则的字符串. 小数据池: 1,节 ...

  9. python中的深浅copy

    深浅copy 复制,首先我们从切片技术说起.它应用于所有的序列,包括:列表,字符串,元祖.但是切片不能应用于字典,对于字典只能使用D.copy() 和 D.deepcopy()方法. 下面具体说一下深 ...

最新文章

  1. php 如何利用 soap调用.Net的WebService asmx文件
  2. Hyper-V备份:选择Hypervisor备份还是虚拟机备份
  3. mysql core 文件_MySQL未能加载文件或程序集“Ubiety.Dns.Core”或它的某一个依赖项 问题的解决...
  4. 百度二次上市涨0.79%,错过移动互联网热潮后牌怎么出?
  5. JeecgBoot 移动OA 新版本出炉,速度体验!!!
  6. signature=fa342ee2b7c3e3e9cba3f194df2d59ca,Date of Signature
  7. codevs 1052 地鼠游戏
  8. POJ 3421 X-factor Chains
  9. 【DFS】LeetCode 51. N-Queens
  10. ASP.Net中防止页面刷新重复提交的几种方法
  11. WPE教程 传奇神秘商店外挂制作
  12. macOS 锐捷校园网解决方案
  13. 捷联惯导系统学习4.3(静基座误差)
  14. 【艾特淘】淘宝流量黄金标题的制作方法本
  15. 如何用matlab求向量在基下的坐标,请问什么是有关向量的基底、基向量、基坐标?...
  16. 硬盘分区表错误与解决办法
  17. 图像艺术风格化 Neural-Style
  18. 李白藏头诗鸿蒙,女子示爱的诗词
  19. 网易2017实习生招聘面试经历
  20. Spring集成Activemq使用

热门文章

  1. 七夕听雨nbsp;想你
  2. python数据类型、变量、列表、字典
  3. 计算机网络RIP协议的源代码
  4. 二进制数的补码及运算(2)
  5. 【MX Component】三菱自带网口与上位机通讯实例全过程图解
  6. ICLR 2022哪篇论文最火?这个「集邮」狂魔放出3400篇大礼包
  7. python浮雕图片_用Python来画浮雕画
  8. java计算机毕业设计网上拍卖系统设计源码+系统+数据库+lw文档+mybatis+运行部署
  9. 在菲律宾做建材生意好还是做纺织生意好?
  10. 歌曲《追梦人》的由来!!!