深浅拷贝

列表存放值的时候,是先申请一块内存空间,存放索引和内存地址的对应关系,其实通俗的来说列表内不存真正的值,是一种间接存放的对应关系;

  • 列表内存不可变类型的数据

就比如说,如果现在将L列表索引0位置的值修改为66,那么这个过程发生了什么?通俗理解为去L[0]去值11的路被销毁了,现在通往了值66,那么这个对应关系就修改了,再次索引出来的L[0]就是66

不管是一维的还是二维的道理都是如此;

二维

浅拷贝

只拷贝了一层,后续需要结合可变与不可变类型理解来决定,

如果一维列表内没有可变类型,其实浅拷贝的影响并不大,如果一维列表内有可变类型的元素,那么就会造成影响

l = [11,22,['xx','yy']]
'''l列表是二维的,列表套列表的结构''' # 浅拷贝
new_l = [:]
# 修改原列表
l[2][0] = 'zz'
print('新列表',new_l) # 新列表 [11,22,['zz','yy']]
print('源列表',l) # 原列表 [11,22,['zz','yy']]
print(id(l[0]),id(l[1]),id(l[2])) # 1627619440 1627619472 2225456877448
print(id(new_l[0]),id(new_l[1]),id(new_l[2])) # 1627619440 1627619472 2225456877448
'''
总结:不论修改原列表还是新列表,修改列表内的不可变类型元素不会对原列表或新列表造成影响,如果修改的是列表内的可变类型元素,那么原列表或新列表会随着修改而修改
原理:拷贝对于不可变类型来说拷贝的是值,但是拷贝对于可变类型元素来说拷贝的是对应关系,可以通过查看原列表和新列表的id值来验证,id值是一样的
'''

总结:不论修改原列表还是新列表,修改列表内的不可变类型元素不会对原列表或新列表造成影响,如果修改的是列表内的可变类型元素,那么原列表或新列表会随着修改而修改

原理:拷贝对于不可变类型来说拷贝的是值,但是拷贝对于可变类型元素来说拷贝的是对应关系,可以通过查看原列表和新列表的id值来验证,id值是一样的

修改值发生了什么变化?

不可变类型:任然不变

可变类型:跟着改变

深拷贝

深拷贝其实就是对浅拷贝不能处理的可变类型进行处理,对应关系更深一层copy;

我们潜意识理解的拷贝,拷贝出来一份你玩你的我玩我的互不影响,深copy就做到如此;

导入:from copy import deepcopy

from copy import deepcopy
l = [11,22,['xx','yy']]
new_l = deepcopy(l)
print(l,id(l)) # [11, 22, ['xx', 'yy']] 1305767841288
print(new_l,id(new_l)) # [11, 22, ['xx', 'yy']] 1305767841352
print(id(l[0]),id(l[1]),id(l[2])) # 1627619760 1627620112 2688776670984
print(id(new_l[0]),id(new_l[1]),id(new_l[2])) # 1627619760 1627620112 2688776669256 '''
列表的id值不一样就代表着这两个列表是不同的列表,两个完全不一样的对象,子列表也是一样
'''
'''不可变类型的id还是一样,不可变类型的id就不一样了,那么列表就相当于造了一个新的列表了'''

现在再修改哪个值都不会对原列表或新列表有影响现在修改值只需修改对应关系再指向新值就可以了

女朋友问我深浅copy到底是什么?的更多相关文章

  1. Objective-C基础之简析深浅copy

    一.从面向对象到Objective-C概览copy 1.面向对象: In object-oriented programming, object copying is creating a copy ...

  2. python深浅copy探究

    引入 在python程序中,如果我们操作一个变量的值去做运算,而又想在下次调用时,仍使用原来的变量的值去做运算,那么我们我们就需要将这个变量去做备份,这就是本文所要探究的问题. 开始 变量-对象-引用 ...

  3. Python之深浅copy与字符编码

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

  4. 总结day6 ---- set集合,基本类型的相互转化,编码,数据类型总结,循环时候不要动列表或者字典,深浅copy

    python小数据池,代码块的最详细.深入剖析   一. id is == 二. 代码块 三. 小数据池 四. 总结 一,id,is,== 在Python中,id是什么?id是内存地址,比如你利用id ...

  5. day07深浅copy与流程控制

    目录:流程控制 0:补充(了解) 短路运算:偷懒原则,偷懒到哪个位置,就把当前位置的值返回 深浅copy 1.循环之while循环 循环的语法与基本使用 死循环与效率问题 循环的应用 退出循环的两种方 ...

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

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

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

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

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

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

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

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

随机推荐

  1. kubectl详解

    kubectl详解 目录 kubectl详解 一.陈述式管理 1. 陈述式资源管理方法 2. k8s相关信息查看 2.1 查看版本信息 2.2 查看资源对象简写 2.3 查看集群信息 2.4 配置ku ...

  2. shell——wait与多进程并发

    在脚本里用&后台打开多个子进程,用wait命令可以使这些子进程并行执行. 例1: fun1(){ while true do echo 1 sleep 1 done } fun2(){ whi ...

  3. Pandas中Series与Dataframe的区别

    1. Series Series通俗来讲就是一维数组,索引(index)为每个元素的下标,值(value)为下标对应的值 例如: arr = ['Tom', 'Nancy', 'Jack', 'Ton ...

  4. 34、python并发编程之多进程(操作篇)

    目录: 一 multiprocessing模块介绍 二 Process类的介绍 三 Process类的使用 四 守护进程 五 进程同步(锁) 六 队列(推荐使用) 七 管道 八 共享数据 九 信号量( ...

  5. Solution -「AT 3913」XOR Tree

    \(\mathcal{Description}\)   Link.   给定一棵树,边 \((u,v)\) 有边权 \(w(u,v)\).每次操作可以使一条简单路径上的边权异或任意非负整数.求最少的操 ...

  6. Solution -「LOJ #6485」 LJJ 学二项式定理

    \(\mathcal{Description}\)   Link.   给定 \(n,s,a_0,a_1,a_2,a_3\),求: \[\sum_{i=0}^n\binom{n}is^ia_{i\bm ...

  7. 上架打包错误:error itms-90086

    这是一个很纠结的错误 大家第一反应肯定是 赶紧去看看 位数是否设置  然后发现没有问题  就开始懵逼了 (比如我) 然而无意看到了一个人写的简书 这个人在 Overflow 找到了一个答案 比如你选择 ...

  8. 重启iptables造成nf_conntrack_max变成65535解决办法

    现象: 查看 sysctl -a |grep nf_conntrack_maxnet.netfilter.nf_conntrack_max = 554288net.nf_conntrack_max = ...

  9. Python 面向对象编程之封装的艺术

    1. 面向对象编程 OOP ( Object  Oriented Programming) 即面向对象编程. 面向对象编程是一种编码思想,或是一种代码组织方式.如同编辑文章时,可以选择分段.分节的方式 ...

  10. GMP

    目录 GMP 含义 模型 状态汇总 G状态 P的状态 M的状态 调度场景 总结 GMP 含义 Goroutine的并发编程模型基于GMP模型,简要解释一下GMP的含义: G:表示goroutine,每 ...