辨异 —— Python 的深拷贝与浅拷贝
对于 numpy 下的 ndarray(多维数组)
>>> x = np.array([1, 2, 3])
>>> y = x
>>> z = np.copy(x)# y 是对 x 的引用 reference# z 才是对 x 的拷贝
>>> a = [1, 2, 3]
>>> b = a>>> a[0] = 4
>>> a
[4, 2, 3]
>>> b
[4, 2, 3]>>> b[1] = 5
>>> b
[4, 5, 3]
>>> a
[4, 5, 3]
![这里写图片描述](https://img-blog.csdn.net/20160215104743466)
如上图所示,当执行完 b = a
的动作后,a
和 b
同时指向同一内存空间(对同一对象的不同引用),即为 浅拷贝,这中间暗含 a
和b
共同指向的内存空间是可以修改的(mutable)。考虑如下的情况:
>>> a = 1
>>> b = a
>>> a = 2
>>> b
1 # 并未随着 a 的改变而改变
这是因为 a = 1
,1
本身不可改(non-mutable),当修改 a = 2
时,打破了原有的指向关系,重新为 a
分配了地址空间:
![这里写图片描述](https://img-blog.csdn.net/20160215111315798)
那么如何实现深拷贝呢,而不至于引起引用的混乱:
或者使用 list
内置的 copy() 成员函数
:
>>> a = [1, 2, 3]
>>> b = a.copy()
或者使用切片赋值:
>>> a = [1, 2, 3]
>>> b = a[:]
再来看一种情形:
>>> a = [1, 2, 3]
>>> b = a
>>> a = []
>>> b
[1, 2, 3]# b 指向的还是那片内存空间
>>> a = [1, 2, 3]
>>> b = a
>>> a = [1, 2, 4]# 不是对原始内存空间中的值进行修改,而是重新赋值
>>> b
[1, 2, 3]
1. 总结
b = a:为浅拷贝
a = [1, 2, 3, 4, 5] b = a >> id(a) == id(b) True >> b[0] = 10# a == [10, 2, 3, 4, 5]
b = a[:]:为深拷贝
c = a[:] >> id(a) == id(c) False
辨异 —— Python 的深拷贝与浅拷贝相关推荐
- Python中深拷贝与浅拷贝的区别?
往期面试题: 列举Python中的标准异常类? 说说Python面向对象三大特性? 说说Python中有几种数据类型? 说说Python模块主要分哪三类? 废话不多说,开始今天的题目: 问:说说Pyt ...
- 【从零学Python】深拷贝和浅拷贝、二维数组初始化
Python 的深拷贝和浅拷贝 直接赋值: 其实就是对象的引用(别名). 浅拷贝(copy): 拷贝父对象,不会拷贝对象的内部的子对象. 深拷贝(deepcopy): copy 模块的 deepcop ...
- python篇 深拷贝与浅拷贝
本章目录 1.拷贝概念 1.2 相关知识点 2.浅拷贝概念 3.浅拷贝演示 4.深拷贝概念 5.深拷贝演示 1.拷贝概念 如果各位捧场的读者老爷对python中''is''和''==''运算符的概念如 ...
- python中深拷贝与浅拷贝的区别
####################python中的数据类型####################### ##########python中的数据类型有6种,分别为:数字类型如int,float ...
- python的深拷贝与浅拷贝
对于list, set, dict来说, 直接赋值. 其实是把内存地址交给变量. 并不是复制⼀份内容. 两个变量的内容其实为一个地址,如果要在复制的同时分配新的地址则需要用到深拷贝和浅拷贝的命令 ls ...
- python中深拷贝和浅拷贝_**Python中的深拷贝和浅拷贝详解
甚至连type其本身都是对象,type对象 Python中变量与C/C++/Java中不同,它是指对象的引用,Python是动态类型,程序运行时候,会根据对象的类型 来确认变量到底是什么类型. 单独赋 ...
- Python基础——深拷贝、浅拷贝
文章目录 1.前言 2.变量的地址(id) 3.浅拷贝(copy.copy) 4.深拷贝(copy.deepcopy) 1.前言 Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用 ...
- 【python】深拷贝、浅拷贝和赋值之间有什么区别?
首先Python提供了三种赋值方法,最常见的是赋值=.浅拷贝copy.copy()和深拷贝copy.deepcopy(). 赋值是使用等于号(=),可以对一个变量进行赋值,赋值就是创建了对象的一个新的 ...
- 浅析Python中深拷贝和浅拷贝
按照以下不同情况,在IDE中逐个解除注释,就明白了 import copy""" 第一种情况,不可变类型变量,都是引用 """ # a = ...
最新文章
- mask-conditional contrast-GAN
- oracle 里面定时执行任务,比如存储过程内容等
- Tomcat源码分析 - 1
- poj 1087 A Plug for UNIX 【最大流】
- python启动c语言gdb,使用gdb调试python程序
- 最有用的Postgres扩展:pg_stat_statements
- java实现arp断网攻击,可攻击局域网内所有的主机
- 面试官:分布式环境下,如何实现session共享
- JavaScript总结(四)
- Android input keyevent命令
- 使用derby导入mongodb数据
- Atiti attilax主要成果与解决方案与案例rsm版
- apollo代码学习1
- 【第四章】详解Feign的实现原理
- 马拉车算法(求最长回文串)
- 算法与程序的区别与联系
- Go中chan引发的协程死锁
- Follow My Heart Of Jan.Feb.Mar. 2023
- 再探https与重放攻击
- 《图数据库》——第 1 章 简介