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,指向了自己,此时出现了数据上的死循环

python学习之深浅拷贝的更多相关文章

  1. Python学习(006)-深浅拷贝及集合

     深浅拷贝 import copy husband=['xiaoxin',123,[200000,100000]] wife=husband.copy() #浅拷贝 wife[0]='xiaohong ...

  2. Python学习 :深浅拷贝

    深浅拷贝 一.浅拷贝 只拷贝第一层数据(不可变的数据类型),并创建新的内存空间进行储蓄,例如:字符串.整型.布尔 除了字符串以及整型,复杂的数据类型都使用一个共享的内存空间,例如:列表 列表使用的是同 ...

  3. Python学习-列表深浅拷贝

    一.先看一个简单的赋值语句 lst1 = ['France', 'Belgium', 'England'] lst2 = lst1 # lst1.append('Uruguay') lst2.appe ...

  4. day8 python学习 集合 深浅拷贝

    1.内存地址: 字符串在20位以内,没有空格,没有特殊字符的情况下,同样的字符串内存地址是一样的 2.元组中:在只有一个值的时在后边加逗号和没有逗号的区别 t1=(1) 不加逗号这个值是什么类型就打印 ...

  5. python学习day7 深浅拷贝&文件操作

    4-4 day07 深浅拷贝&文件操作 .get()用法 返回指定键的值,如果值不在字典中返回默认值. info={'k1':'v1,'K2':'v2'}mes = info.get('k1' ...

  6. 第五篇python进阶之深浅拷贝

    目录 第五篇python进阶之深浅拷贝 一.引言 1.1可变 和不可变 二.拷贝(只针对可变数据类型) 三.浅拷贝 四.深拷贝 第五篇python进阶之深浅拷贝 一.引言 1.1可变 和不可变 id不 ...

  7. 天啦噜!仅仅5张图,彻底搞懂Python中的深浅拷贝

    Python中的深浅拷贝 在讲深浅拷贝之前,我们先重温一下 is 和==的区别. 在判断对象是否相等比较的时候我们可以用is 和 == is:比较两个对象的引用是否相同,即 它们的id 是否一样 == ...

  8. Python 中的深浅拷贝

    Python 中的深浅拷贝 参考文献:https://blog.csdn.net/lnotime/article/details/81194633 参考文献:https://blog.csdn.net ...

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

    初学编程的小伙伴都会对于深浅拷贝的用法有些疑问,今天我们就结合python变量存储的特性从内存的角度来谈一谈赋值和深浅拷贝~~~ 预备知识一——python的变量及其存储 在详细的了解python中赋 ...

随机推荐

  1. k8sDaemonSet控制器

    DaemonSet用于再集群中的全部节点上同时运行一份指定的pod资源副本,后续新加入的工作节点也会自动创建一个相关的pod对象,当从集群中移除节点时,此类pod对象也将被自动回收而无须重建.也可以使 ...

  2. vue使用echart中国地图

    /* 引入 ECharts (按需加载) 文档:http://echarts.baidu.com/tutorial.html#%E5%9C%A8%20webpack%20%E4%B8%AD%E4%BD ...

  3. 手机端自适应缩放显示 js

    <script> var _width = parseInt(window.screen.width); var scale = _width/640; var ua = navigato ...

  4. 【leetcode】1232. Check If It Is a Straight Line

    题目如下: You are given an array coordinates, coordinates[i] = [x, y], where [x, y] represents the coord ...

  5. 顺序查找(Sequential Search)

    1.定义 顺序查找又叫线性查找,是最基本的查找技术. 2.基本思想 从表的一端开始(第一个或最后一个记录),顺序扫描线性表,依次将扫描到的结点关键宇和给定值K相比较.若当前扫描到的结点关键字与K相等, ...

  6. Pygame模块实现功能超赞的贪吃蛇

    import pygame import random import sys import pygame.freetype import re import datetime   pygame.ini ...

  7. centos6.9 samba配置

    https://blog.csdn.net/qq_33468857/article/details/75431813 1 使用用户名密码访问 [global] security = user [hom ...

  8. mosquitto订阅发布参数详解

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...

  9. linux下快速查找文件(转载)

    权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/xxmonstor/article/deta ...

  10. leetcode-easy-others-268 Missing Number

    mycode   80.25% class Solution(object): def missingNumber(self, nums): """ :type nums ...