4.2 深浅拷贝

4.2.1 认识

首先应该知道python中变量在内存中是怎么存放的!

在python中,变量与变量的值占用不同的内存。变量占用的内存,并非直接存储数值,而存储的是值在内存中的地址。

各种变量在内存中的存储,如下图:

下面进行代码测试:

ls = ['德玛','皇子','赵信']
ls1 = ls           #ls1 = ls 实际上是ls1指向了ls指向的地址块,两者指向的是同一块地址区域,不是拷贝
print(ls1)         #输出ls = ['德玛','皇子','赵信']
ls.append('女警')   #对ls进行元素操作时,也是对ls1造成影响
print(ls1)         #输出['德玛', '皇子', '赵信', '女警']
ls2 = ls[:]        #利用切片,在内存中新建了一个列表,ls2指向这个新的列表,浅拷贝
print(ls2)         #输出ls = ['德玛','皇子','赵信']
ls.append('剑豪')   #对ls的元素进行任何操作,都不会影响ls2的内容
print(ls2)          #输出ls = ['德玛','皇子','赵信']

注意: a = 1 b= a 这不是拷贝,赋值是多个变量指向同一个内存地址,内存的任一元素改变,所有变量都受影响;

​ a = [1,2,3,4] b=a[:] 这是切片,切片是得到了一个新的列表,属于浅拷贝。

4.2.2 浅拷贝.copy

对只有一层元素关系的列表进行测试:

ls = ['德玛','皇子','赵信']
ls1 = ls.copy()
print(id(ls),id(ls1))    #输出  2551633171528 2551633985416,可见二者指向的内存地址不同
ls.append('剑豪')
ls1.append('女警')
print(ls)            #输出 ['德玛', '皇子', '赵信', '剑豪'],对ls的append操作没有影响ls1
print(ls1)          #输出 ['德玛', '皇子', '赵信', '女警'],对ls1的append操作没有影响ls
ls.pop(ls[0])

从以上结果可得:在copy完之后,新的列表指向新的内存地址,分别对列表的最后一位进行appen操作,结果互不影响。

对具有二层的元素的列表进行测试:

##对ls的第二个元素进行append操作
ls = ['德玛',['费欧娜','戴安娜'],'赵信']
ls1 = ls.copy()
print(ls1)                  #输出['德玛', ['费欧娜', '戴安娜'], '赵信']
ls[1].append('莫甘娜')       #copy完成后对ls的第二个元素进行append操作
print(ls1)           #输出'德玛', ['费欧娜', '戴安娜', '莫甘娜'], '赵信'],ls1发生了改变
print(id(ls[1]),id(ls1[1]))  #查看两者的ID,2202073060424 2202073060424##对ls1的第二个元素进行操作
ls = ['德玛',['费欧娜','戴安娜'],'赵信']
ls1 = ls.copy()
print(ls)               #输出['德玛', ['费欧娜', '戴安娜'], '赵信']
ls1[1].append('莫甘娜')    #copy完成后对ls1的第二个元素进行append操作
print(ls)           #输出'德玛', ['费欧娜', '戴安娜', '莫甘娜'], '赵信'],ls发生了改变
print(id(ls[1]),id(ls1[1]))  #输出 2303581443144 2303581443144

从上边输出的结果来看,copy完成之后,分别对ls和ls1的中间元素进行append操作,对方的元素也会发生相应的改变。

结论:浅拷⻉, 只会拷⻉第⼀层内容,只拷贝第二层关系的内存地址,而第⼆层的内容不会拷贝,所以被称为浅拷贝。

4.2.3 深拷贝.deepcopy()

深拷贝使用之前一定要先加载copy模块,import copy

语法为:

import copy

new_ls = copy.deepcopy(ls)

#对ls进行二层操作
import copy
ls = ['德玛',['费欧娜','戴安娜'],'赵信']
ls1 = copy.deepcopy(ls)
ls[1].append('莫甘娜')
print(ls)                 #输出['德玛', ['费欧娜', '戴安娜', '莫甘娜'], '赵信']
print(ls1)               #输出['德玛', ['费欧娜', '戴安娜'], '赵信']#对ls1进行二层操作
import copy
ls = ['德玛',['费欧娜','戴安娜'],'赵信']
ls1 = copy.deepcopy(ls)
ls1[1].append('莫甘娜')
print(ls)               #输出['德玛', ['费欧娜', '戴安娜'], '赵信']
print(ls1)              #输出['德玛', ['费欧娜', '戴安娜', '莫甘娜'], '赵信']

由以上结果可得:深拷贝是完完全全的复制,是创建一个完完全全的新的对象,新旧对象之间不会相互影响。不可变数据类型新旧列表指向同一个空间,可变类型新列表创建了新的空间

【注意:】

a = [1, 2]
a[1] = a   #对a列表的第二个元素进行修改成自己
print(a[1])  #输出为[1, [...]]
print(id(a),id(a[1]))  #输出内存地址1191853053000 1191853053000  a与a[1]的内存地址一样
print(type(a[1]))  ##输出<class 'list'>

分析: a[1] 原来是int类型,在对a[1]进行修改操作时,会先把原来的指向剪断,因为赋值a,指向了自己,此时出现了数据上的死循环

转载于:https://www.cnblogs.com/jjzz1234/p/11027414.html

python学习之深浅拷贝相关推荐

  1. Python赋值与深浅拷贝

    # coding=utf-8 #Python 赋值 与深浅拷贝 #Python 赋值时会创建一个新的引用,对不可变对象,实际上象创建一个副本,但对可变对象,因为是引用,当对其中一个对象的元素进行操作时 ...

  2. python赋值、深浅拷贝

    赋值: 赋值是绑定对象的引用:只要对象被修改,就会发生变化 深浅拷贝 如果希望将列表复制一份,通过列表的内置方法copy就可以实现: s = [[1,2],3,4]s1 = s.copy()print ...

  3. python——赋值与深浅拷贝

    结合python变量存储的特性从内存的角度来谈一谈赋值和深浅拷贝~~~ 预备知识一--python的变量及其存储 在详细的了解python中赋值.copy和deepcopy之前,我们还是要花一点时间来 ...

  4. Python系列 18 深浅拷贝

    拷贝 copy即拷贝,意在将相同的数据进行复制,以便将复制出的副本应用于不同的操作上,而本体不会受到任何影响. 绝大多数语言中都有深浅拷贝的概念,故此篇文章也是属于通用性文章. 在Python中,除开 ...

  5. python中的深浅拷贝

    1.    浅拷贝  copy.copy 浅拷贝是对于⼀个对象的顶层拷贝 通俗的理解是:拷贝了引⽤,并没有拷贝内容 浅拷贝只复制第一层数据,更深层的引用不管. 2.    深拷贝   copy.dee ...

  6. python list 的深浅拷贝探索

    对于list来讲,除了使用copy.deepcopy()来实现深copy外,还可以使用什么更加简单的方式呢?下面先介绍copy.deepcopy()例子: >>> a = [1] & ...

  7. python中的深浅拷贝的区别

    li = [1,1,2,3,4,5,6,7,8,9]l2=li # 这样定义不行共用内存空间,其实是一体# l2 = [1,1,2,3,4,5,6,7,8,9]l3=li[:]for i in l2: ...

  8. Python的深浅拷贝讲解!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:皮钱超,厦门大学,Datawhale原创作者 本文约3000字,建 ...

  9. 【Python基础】Python的深浅拷贝讲解

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 前言 在很多语言中都存在深浅拷贝两种拷贝数据的方式,Python中 ...

最新文章

  1. 我要做 Android 之面笔试总结
  2. 窗口不小心拉到任务栏下面,窗口无法拖回桌面的解决办法
  3. html5表白页面3d,七夕节表白3d相册制作(html5+css3)
  4. 北京大学c语言试题及答案,北大网络教育(计算机专业)C程序设计作业答案
  5. 移动端如何定义字体font-family
  6. 各种语音编码方法,所需要的带宽
  7. 2022电大国家开放大学网上形考任务-中华文化概说非免费(非答案)
  8. PS2020制作电子签名
  9. 切换进程 切换线程
  10. 索辰科技回复首轮问询:2021年收入约2亿元,募投项目遭质疑
  11. iOS中Mach异常和signal信号介绍,以及当APP崩溃时做线程保活弹出程序异常提示框
  12. SAP_控制TECO生产订单不能发料及收货
  13. 数据通信是计算机网络最基本功能,计算机网络最基本的功能是数据通信和()。A.打印文件B.文件调用C.降低成本D.资源共享...
  14. 实战|Python爬取字节跳动1W+招聘信息
  15. 微信小程序之发送通知消息(通过openid推送消息给用户)
  16. 详解各种各样的 “BW” —OBW,IBW ,RBW,VBW
  17. 2019年广东工业大学腾讯杯新生程序设计竞赛(同步赛)I-迷途的怪物
  18. TSL2561传感器介绍
  19. C语言编写程序,输入三角形的三条边长,求三角形的面积。设输入的三条边长a、b、c能构成三角形。
  20. 工作之余休闲的55件事情

热门文章

  1. html打印为pdf时为空白,CAD打印成PDF时,预览的时候是可以看到,但打印后是空白的,不知为什么?...
  2. UniAPP 快速入门学习
  3. 程序员的这108个笑话 你都看得懂吗?
  4. gdtv.php,gdtv.m3u
  5. application terminated怎么解决_Windows10 无法打开.exe可执行文件的解决方法
  6. 越来越多的人认为边缘计算是大势所趋
  7. 通信原理:数字信号的载波传输
  8. RafyA PS合成作品欣赏(1)
  9. 各类型博物馆典型案例分析
  10. 用java实现情人节