深浅拷贝:数据分离情况

1. =赋值:数据完全共享(指向内存中的同一个对象)
被赋值的变量指向的数据和原变量的数据都是指向内存中的同一个地址:

  • (1)如果是不可变数据类型(数字、字符串等),修改其中的一个值,实际是修改了变量指向与值对应的地址(相当于重新被赋值),因此不会同时发生变化;
  • (2)如果是可变数据类型(列表、字典等),在修改数据时仅仅是其本身的地址指向发生了改变,但是指向可变数据类型的地址并未改变,因此会同时发生改变。
  •  print("以下是赋值")
    a=[1,2,"",[4,5]]
    b=a
    print(a,id(a))
    print(b,id(b)) b[0]=11
    b[3][0]=44
    print(a)
    print(b) #结果:
    #以下是赋值
    # [1, 2, '4', [4, 5]] 119820576
    # [1, 2, '4', [4, 5]] 119820576
    # [11, 2, '4', [44, 5]]
    # [11, 2, '4', [44, 5]]

 2. 浅copy:数据半共享(仅可变数据类型指向同一个对象)
复制其数据独立内存存放(新建一个地址指向),但是只拷贝成功第一层:

  • (1)如果是不可变数据类型(数字、字符串等),共用其地址,但修改其中一个变量的值,由于浅copy的两个变量的地址指向独立,因此只有本身值被修改的变量发生变化,另一个不会改变;
  • (2)如果是可变数据类型(列表、字典等),在修改数据时仅仅是其本身的地址指向发生了改变,但是指向可变数据类型的地址并未改变,因此会同时发生改变。
  •  print("以下是浅拷贝")
    
     a=[1,2,"",[4,5]]
    b=a.copy()
    print(a,id(a),id(a[0]),id(a[-1]))
    print(b,id(b),id(b[0]),id(b[-1])) b[0]=11
    b[3][0]=44
    print(a)
    print(b) # 结果:
    # 以下是浅拷贝
    [1, 2, '', [4, 5]] 127947040 1350511760 128225072
    [1, 2, '', [4, 5]] 56886776 1350511760 128225072
    [1, 2, '', [44, 5]]
    [11, 2, '', [44, 5]]

 

3. 深copy:数据完全不共享(数据独立,互不影响)
复制其数据完完全全放独立的一个内存,完全拷贝,数据不共享:

  • (1)如果是不可变数据类型(数字、字符串等),修改其中一个变量的值,由于深copy的两个变量的地址指向独立,因此只有本身值被修改的变量发生变化,另一个不会改变;
  • (2)如果是可变数据类型(列表、字典等),深拷贝完全复制独立的一份,在修改数据时仅仅是其本身的地址指向发生了改变,由于是深copy,指向可变数据类型的地址完全独立,因此另一个变量不会发生改变。
  •  import copy
    print("以下是深拷贝") a=[1,2,"",[4,5]]
    b=copy.deepcopy(a)
    print(a,id(a),id(a[0]),id(a[-1]))
    print(b,id(b),id(b[0]),id(b[-1])) b[0]=11
    b[3][0]=44
    print(a)
    print(b) 结果:
    以下是深拷贝
    [1, 2, '', [4, 5]] 123425056 1350511760 123703088
    [1, 2, '', [4, 5]] 52233720 1350511760 123700448
    [1, 2, '', [4, 5]]
    [11, 2, '', [44, 5]]

pyhton中的深浅copy的更多相关文章

  1. python列表中的深浅copy

    列表中的赋值和平常的赋值是不一样的,看下面的代码: In [1]: a = 1 In [2]: b = a In [3]: a Out[3]: 1 In [4]: b Out[4]: 1 In [5] ...

  2. python中的深浅copy

    https://www.cnblogs.com/Eva-J/p/5534037.html 转自Eva_J  分析的特别好

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

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

  4. Python中的代码块及其缓存机制、深浅copy

    一.代码块及其缓存机制 代码块 一个模块.一个函数.一个类.一个文件等都是一个代码块:交互式命令下,一行就是一个代码块. 同一个代码块内的缓存机制(字符串驻留机制) 机制内容:Python在执行同一个 ...

  5. python基础3(元祖、字典、深浅copy、集合、文件处理)

    本次内容: 元祖 字典 浅copy和深copy 集合 文件处理 1.1元祖 元祖(tuple)与列表类似,不同之处在于元祖的元素不能修改,元祖使用小括号(),列表使用方括号[].元祖创建很简单,只需要 ...

  6. python学习笔记三 深浅copy,扩展数据类型(基础篇)

    深浅copy以及赋值 对于字符串和数字而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. import copy n1 = #n1 = 'hahahaha' #赋值n2 = n1#浅co ...

  7. Python 第三篇(下):collections系列、集合(set)、单双队列、深浅copy、内置函数

     一.collections系列: collections其实是python的标准库,也就是python的一个内置模块,因此使用之前导入一下collections模块即可,collections在py ...

  8. Python 基础之函数、深浅copy,set及练习

    三元运算符通常在Python里被称为条件表达式,这些表达式基于真(true)/假(not)的条件判断,在Python 2.4以上才有了三元操作. 语法格式: X if C else Y 有了三元表达式 ...

  9. python基础(三)编码,深浅copy

    编码,深浅copy encode,decode在python2中使用的一些迷糊,python3中更容易理解 要理解encode和decode,首先我们要明白编码,字符和二进制的相关概念,简单来说,计算 ...

随机推荐

  1. Django ORM 查询表中某列字段值

    场景: 有一个表中的某一列,你需要获取到这一列的所有值,你怎么操作? 解决办法: 有一个model为:Event 方式一: 获取内容: Event.objects.values('title') 输出 ...

  2. dns的抓包分析

    dns: 域名系统(服务)协议 dns的解析全过程: 1. 浏览器先检查自身缓存中有没有被解析过的这个域名对应的ip地址,如果有,解析结束.同时域名被缓存的时间也可通过TTL属性来设置. 2. 如果浏 ...

  3. Redis持久化存储(二)

    redis多实例介绍 接上一篇redis.创建数据存放的目录 vim redis.conf +187 dir /application/data/ 重新启动 mkdir /application/da ...

  4. 在 ubuntu20 上替换原有的源,解决下载软件慢的问题

    处理方式 使用命令查看到所有的下载源 sudo gedit /etc/apt/sources.list 使用163的源替换掉原始的源 163:http://mirrors.163.com/ubuntu ...

  5. Leetcode PHP题解--D75 706. Design HashMap

    2019独角兽企业重金招聘Python工程师标准>>> D75 706. Design HashMap 题目链接 706. Design HashMap 题目分析 自行设计一个has ...

  6. 面向对象第四单元(UML)总结

    OO第四单元 一.总结本单元两次作业的架构设计 第一次作业 架构 第一次作业只有类图,所以全部的UmlElement都可以放在MyUmlInteraction中进行存储.计算和查找.对于类图来说,可以 ...

  7. 图论--2-SAT--HDOJ/HDU 1824 Let's go home

    Problem Description 小时候,乡愁是一枚小小的邮票,我在这头,母亲在那头.                         -- 余光中 集训是辛苦的,道路是坎坷的,休息还是必须的. ...

  8. CUDA编程学习相关

    1. CUDA编程之快速入门:https://www.cnblogs.com/skyfsm/p/9673960.html 2. CUDA编程入门极简教程:https://blog.csdn.net/x ...

  9. Android EXCEL 解析 xls 和 xlsx,方法其实很简单

    前言 Excel 解析,一般来说是在服务端进行的,但是如果移动端要实现解析Excel的功能,那也是有实现的方法的. 不过由于Android 原生用Java/Kotlin实现,所以也可以参考服务端解析E ...

  10. thinkphp-getshell Bypass

    年前写的了,做测试用,主要利用 session getshell 或者thinkphp 的log  //勿用attack  测试 import requests import time import ...