python怎么实现deepcopy_python复制.deepcopy()深度解读,pythoncopydeepcopy,深入
copy.deepcopy()的用法是将某一个变量的值赋值给另一个变量(此时两个变量地址不同),因为地址不同,所以可以防止变量间相互干扰。
大家可以猜猜下面代码第四行输出什么值
例1.
a = [1, 2, 3]
d = a # a和d的地址相同, 看第5行的输出
a[0] = 2
print(d)
print(id(a), id(b)) # id() 输出a和d变量的地址
答案是:[2 2 3]
[2, 2, 3]
2063948923080 2063948923080
原因是通过赋值的方式使得d和a的地址相同,即d和a指向内存中的同一个地址。
而且改变d中的值,a也会随着改变,自己可以尝试一下。
如果想让a和d两个变量互不影响,就用copy.deepcopy()函数
例2.
import copy
a = [1, 2, 3]
d = copy.deepcopy(a) # a和d的地址不相同
a[0] = 2
print(d)
print(id(a), id(d))
输出:
[1, 2, 3]
2793378037960 2793379617288
思考下面代码会输出什么:
例3.
a = [1, 2, 3]
d = a
c = 1 # 注意 1其实也有地址,而且这个地址是固定的,不会随程序发生改变。
a = c
print(d)
如果你有点绕不开了,先看看答案吧。
答案是:
[1, 2, 3]
也许你奇怪a和d的地址不是一样的吗,怎么改变了a,d还是不变了。原因很简单,因为c的地址和a的地址不同,把c赋值给a,则a的地址和c的地址相同,但d的地址在初始时就已经是a原先的地址了。即使a的地址后来发生了变化,d的地址也不受影响。
通过以上的介绍你可能会认为
只要两个变量的地址不同,则两者之间不会相互影响,否则就会
。真的是这样吗?
上面的例子比较简单,可以这么认为。再补充几个例子,看看程序的输出与自己想象的结果是否一样:
例4.
import numpy as np
a = np.array([[1,2,3], [5,5,5]])
d = a.transpose(1,0)
print(id(d), id(a)) # a和d的地址不同,但d会受a的影响,当然a也会受d影响
a[0, 0] = 9
print(d)
输出:
2129658874816 2129658874576
[[9 5]
[2 5]
[3 5]]
例5
import numpy as np
a = np.array([1, 2, 3])
b = np.array([1, 5, 6])
c = np.array([a, b])
print(id(a), id(c), id(c[0])) # 虽然c[0]值等于a,但c[0]和a的地址不同
a[0] = 9
print(c)
输出:
2204876507856 2204879229216 2204879229296
[[1 2 3]
[1 5 6]]
例6
import numpy as np
a = np.array([1, 2, 3])
b = np.array([1, 5, 6])
c = a - b
a[0] = 9
print(c)
输出:
[ 0 -3 -3]
例7.
import numpy as np
c = np.array([[3, 2, 3], [5, 7, 8]])
e = c[0]
e[0] = 9
print(c)
print(id(e), id(c[0]), id(c[1]), id(c)) # e和c的地址不同,但和c[0]相同
输出:
[[9 2 3]
[5 7 8]]
1965873400768 1965876121968 1965876121968 1965873400528
总结:①从例5,6可以看出,如果一个变量由多个变量通过某种方式(拼接或加减)得来的,则这个变量不会受其他变量的影响。但结合例7,如果一个变量e来自另一个变量c的某一部分值,则改变量e的值(不改变e的地址时),变量c也会受影响。②从例4可知,虽然两个变量a,d地址不同,但d是通过a经过自身变换(转置,只改变形状)而来,所以改变某一个变量内的值,另一个变量也会跟着改变。所以说并不能单纯地认为变量地址不同,变量间就不会相互影响。所以为了防止变量间相互影响,使用copy.deepcopy()方法最为安全。
python怎么实现deepcopy_python复制.deepcopy()深度解读,pythoncopydeepcopy,深入相关推荐
- Python 直接赋值、浅拷贝和深度拷贝全解析
直接赋值:其实就是对象的引用(别名,其实就是一个人今天叫张三 明天叫张狗子的意思). 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象. 深拷贝(deepcopy): copy 模块的 de ...
- 深度解读谷歌开源的最精确自然语言解析器SyntaxNet
深度解读谷歌开源的最精确自然语言解析器SyntaxNet 谷歌开源了SyntaxNet,也发布了针对英语的预训练解析程序 Parsey McParseface.除了让更多人使用到最先进的分析技术之外, ...
- 关于私有云与存储风向的深度解读
2019独角兽企业重金招聘Python工程师标准>>> 2018年是不平凡的一年,IT业界风云变幻.9月30日,腾讯宣布开启第三次组织架构升级,全面拥抱产业互联网,马化腾认为产业互联 ...
- 【NLP】Transformer模型深度解读
" 本文对Transoformer模型进行了深度解读,包括整体架构,Attention结构的背景和细节,QKV的含义,Multi-head Attention的本质,FFN,Position ...
- 深度解读 MongoDB 4.4 新特性
简介:随着计算和数据上云的趋势愈发明显,传统数据库"步履蹒跚",云数据库将是未来.本次直播,阿里云将隆重发布2款全新升级产品--云数据库 MongoDB 4.4 和MongoDB ...
- 深度解读 MongoDB 最全面的增强版本 4.4 新特性
MongoDB 在今年正式发布了新的 4.4 大版本,这次的发布包含众多的增强 Feature,可以称之为是一个维护性的版本,而且是一个用户期待已久的维护性版本,MongoDB 官方也把这次发布称为「 ...
- python复制列表元素_Python学习教程:Python列表赋值,复制,深拷贝及5种浅拷贝详解...
Python学习教程:Python列表赋值,复制,深拷贝及5种浅拷贝详解 概述 在列表复制这个问题,看似简单的复制却有着许多的学问,尤其是对新手来说,理所当然的事情却并不如意,比如列表的赋值.复制.浅 ...
- kafka 数据可靠性深度解读
文章目录 kafka 数据可靠性深度解读 多分区.多副本 多分区的设计的特点: kafak 分区 leader 机制 kafka 数据可靠性深度解读 多分区.多副本 kafka 的消息保存在Topic ...
- AWR 报告深度解读:Redo Nowait指标的算法和诊断
墨墨导读:本文将对Redo Nowait指标的算法和诊断进行深度解析. 为了系统化的梳理 AWR 的知识体系,我们整理了一个系列文章,希望从原理.使用到 AWR 报告的解读,给读者展示全面的 AWR ...
最新文章
- python3爬取新浪NBA新闻信息(待完善)
- 中国联通李福昌:探索无线连接的未来
- Netty学习笔记(二) 实现服务端和客户端
- 超经典的存储过程分页 ;-) 引自CSDN网友所作
- 网工路由基础(6)BGP协议
- 服务器设置为自动登录,Windows Server 2008 R2怎样设置自动登陆(登录)
- 软件设计师-不确定有限自动机到确定有限自动机转换的例子
- C++11 右值引用与移动语义
- gcc动态链接库基本知识 [转]
- centos6 ab性能测试web服务器
- 翻译: 4.4. 模型选择Model Selection、欠拟合Underfitting和过拟合Overfitting pytorch
- 如何使用Flutter开发web应用
- webssh的安装与使用
- 软件开发人员的能力模型
- 项目经理应对需求变更的策略
- 两轮差速移动机器人从A点移动到B点的C++语言代码
- Django快速入门教程
- 服务器和普通电脑有什么区别?
- word2010生成的目录右侧不对齐怎么办?
- 《银影侠》独立电影可能会真的成行了