一:直接赋值

赋值,就是对象的引用,给对象起别名。

i = 8
j = i
print("值是:",i, "地址:",id(i))
print("值是:",j, "地址:",id(j))

输出如下:

值是: 8 地址: 1639640400
值是: 8 地址: 1639640400

i 是一个int类型的对象,j 是指向 i 变量对应的对象,其实是内存地址。可以看到,j和i的值和地址都是一样的,

b = a: 赋值引用,a 和 b 都指向同一个对象。

二:浅拷贝

拷贝父对象,不会拷贝对象的内部的子对象。

a = [1,2,[3,4,5,6]]
b = a.copy() print(a, "\t", id(a), id(a[2]))
print(b, "\t", id(b), id(b[2])) a[2].append("abc")
print(a)
print(b)

输出如下:可以看到,a和b的内存地址不一样,但a[2]和b[2]的内存地址是一样的,说明指向的是同意个对象,对父对象进行操作,会印象拷贝对象。

[1, 2, [3, 4, 5, 6]]      2091843623432 2091843623368
[1, 2, [3, 4, 5, 6]] 2091843623752 2091843623368
[1, 2, [3, 4, 5, 6, 'abc']]
[1, 2, [3, 4, 5, 6, 'abc']]

b = a.copy(): 浅拷贝, a 和 b 是一个独立的对象,但他们的子对象还是指向统一对象(是引用)。

三:深拷贝

copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。

import copy
a = [1,2,[3,4,5,6]]
b = copy.deepcopy(a) print(a, "\t", id(a), id(a[2]))
print(b, "\t", id(b), id(b[2])) a[2].append("abc")
print(a)
print(b)

输出如下:可以看到,这一次a和b的内存地址也不一样了,且对父对象进行操作,不会印象拷贝对象。

[1, 2, [3, 4, 5, 6]]      2143840475656 2143840475592
[1, 2, [3, 4, 5, 6]] 2143840475976 2143840475912
[1, 2, [3, 4, 5, 6, 'abc']]
[1, 2, [3, 4, 5, 6]]

b = copy.deepcopy(a): 深度拷贝, a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的。

参考文章:https://www.runoob.com/w3cnote/python-understanding-dict-copy-shallow-or-deep.html

***************不积跬步无以至千里***************

python直接赋值、浅拷贝、深拷贝的区别的更多相关文章

  1. python中赋值-浅拷贝-深拷贝之间的关系

    赋值: 变量的引用,没有拷贝空间 对象之间赋值本质上 是对象之间的引用传递而已.也就是多个对象指向同一个数据空间. 拷贝的对象分两种类型: . 拷贝可变类型 浅拷贝: 只拷贝第一层数据,不关心里面的第 ...

  2. python中赋值,深拷贝,浅拷贝区别

    这三种 的区别就是 复制的变量 是否是原变量的引用. 赋值:只是原变量的引用. 浅拷贝和深拷贝的区别 需要通过 子元素 区分 浅拷贝:子元素的 引用相同 深拷贝:所以引用都不相同,完全复制一份 这三种 ...

  3. python开发_copy(浅拷贝|深拷贝)_博主推荐

    在python中,有着深拷贝和浅拷贝,即copy模块 下面我们就来聊一下: 运行效果: ================================================== 代码部分: ...

  4. python的赋值,深拷贝和浅拷贝的区别

    原文地址https://www.cnblogs.com/xueli/p/4952063.html 赋值:a = [1,2,3,["a","b"]]  b=a,那 ...

  5. 深入理解Python中赋值、深拷贝(deepcopy)、浅拷贝(copy)

    赋值 python跟java中的变量本质是不一样的,Python的变量实质上是一个指针(int型或str型),而java的变量是一个可操作的存储空间. a = 123b = a print(id(a) ...

  6. python 中的 赋值 浅拷贝 深拷贝

    1.对象的赋值 都是进行对象引用(内存地址)传递,即 b is a ,a 变 b也变 2.浅拷贝 会创建一个新的对象,对于对象中的元素,浅拷贝就只会使用原始元素的引用(内存地址) 当我们使用下面的操作 ...

  7. 搞不懂JS中赋值·浅拷贝·深拷贝的请看这里

    前言 百科定义:拷贝就是拷贝指向对象的指针,意思就是说:拷贝出来的目标对象的指针和源对象的指针指向的内存空间是同一块空间,浅拷贝只是一种简单的拷贝,让几个对象公用一个内存,然而当内存销毁的时候,指向这 ...

  8. [Python] 等号赋值, copy, deepcopy的区别

    参考链接: 1. 介绍python中的可变类型与不可变类型:https://blog.csdn.net/answer3lin/article/details/86430074 (也可以参考转载博客 P ...

  9. Python练习四-浅拷贝&深拷贝

    一.数字.字符串不论是浅拷贝.深拷贝都是指向一个地址. a = 1 b = "abc" print (id(a)) print (id(b)) a1 = a b1 = b prin ...

  10. Python中的浅拷贝 深拷贝

    浅拷贝只拷贝父对象,子对象的地址空间不改变,包括下面三种: 1. copy 从下面的例子可以看出对象c从a拷贝,当对象a增加一个列表元素之后,c对象没有改变, 而当对象a中的子列表改变时,对象c的子列 ...

随机推荐

  1. [debug] 解决新建项目属性中没有 c\c++

    写一些代码(不写不行),然后生成,然后就可以看到这个选项了

  2. MFC程序出现uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)解决办法

    在同一个地方摔倒两次之后,决定记录下来这个东西. 问题 1>uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl opera ...

  3. Jupiter 页面环境下使用pip无法安装(AttributeError: module 'pip' has no attribute 'main')

    异常: AttributeError Traceback (most recent call last) <ipython-input-5-880e5dfa627c> in <mod ...

  4. arcgis api 4.x for js 结合 Echarts4 实现统计图(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 4.x for js:esri 官网 api,里面详细的介绍 arcgis api 4.x 各个类 ...

  5. Linux发行版的系统目录名称命名规则以及用途

    linux各种发行版都遵循LSB(Linux Stadards Base)规则,使用一致的相关的基础目录名称,使用根目录系统结构(root filesystem),使用FHS(Files Hierar ...

  6. 开启docker

    systemctl daemon-reload systemctl restart docker.service

  7. 外部调用Tomcat启动脚本后日志中文显示乱码问题的解决

    外部sh脚本如下 #!/bin/bash while read LINE do echo "Hello $LINE!" case $LINE in all) tail -f -n2 ...

  8. 生成对抗性网络GAN

    同VAE模型类似,GAN模型也包含了一对子模型.GAN的名字中包含一个对抗的概念,为了体现对抗这个概念,除了生成模型,其中还有另外一个模型帮助生成模型更好地学习观测数据的条件分布.这个模型可以称作判别 ...

  9. 编译出错:must be index or base register

    指令 mov ds:[dx],dx 原因:上述指令使用寄存器相对寻址方式,只能使用BX,BP,SI,DI 方括号里必须是变址(index,指SI, DI)或基址(base,指BX, BP)寄存器 正确 ...

  10. Qt的诞生和本质

    有没有发现,在这个主函数里面没有了消息循环了.消息循环到哪里去了呢? 我们知道,每个GUI应用程序都有消息循环,一般都需要将消息循环while那个函数写到main的最后位置.那既然如此,为了代码复用, ...