Python赋值、浅复制和深复制
Python赋值、浅复制和深复制
首先我们需要知道赋值和浅复制的区别:
赋值和浅复制的区别
赋值,当一个对象赋值给另一个新的变量时,赋的其实是该对象在栈中的地址,该地址指向堆中的数据。即赋值后,两个对象指向的是堆中同一块内存空间。当任何一个对象发生某些改变时,另一个也会发生同样的改变。这里的两个对象其实就是两个引用。
而浅复制,它会创建一个新的对象,即会在堆内存区开辟一个新的内存区域,存储新的对象,但是新的对象内存的只是原对象内元素的引用。当原对象的数据都是不可变数据时,此时浅复制和深复制是一样的。若是原对象内有可变数据,那么也只是复制那个可变数据的引用。
所以二者的区别即,赋值只不过给那段内存数据多起了一个名字,但是东西还是一个东西。而浅复制是创造了一个新的对象,并复制了原对象中所有的引用。
浅复制和深复制的区别
浅复制上面已经说过了。
深复制,深复制也会创建一个新的对象,会在内存当中开辟一个新的空间,对于不可变数据和浅复制是一样的,但是对于可变数据,深复制会在堆内存中创建一个一模样的数据,并返回引用,此时两个可变数据的内容一模一样,但是内存地址并不一样。
所以二者的区别就在于可变数据的复制,浅复制复制之后可变数据和原来的可变数据是同一块内存,改变这个数据,二者都将改变。而深复制,两个对象无论怎么变化都不会有相互影响。
浅复制的6种方法(有些是针对列表的)
原数据a = [1, 2, 3]
b = a[:]
,这个操作其实就是列表的切片操作,但是比较特殊,因为切出来的就是自己b = list(a)
,这个操作针对的不仅仅是列表,a可以是别的可变为列表的数据b = a * 1
, 这个不做过多解释b = [x for x in a]
,这个就是做了一个遍历的操作,并把引用复制一遍,即浅复制了。b = a.copy()
,这个是列表自带的浅复制,同样字典也有(二者都是可变数据)b = copy.copy(a)
,这个就是借助copy模块里面的浅复制。
深复制的方法
b = copy.deepcopy(a)
, 这个也是借助copy模块,copy模块里面有个deepcopy方法,也就是深复制。
讲的多不如例子来的实在
赋值和浅复制的区别
import copy
a = [1, 2, 3, [4, 5]]
# 赋值
b = a
# 浅复制
c = a[:]
# 改变原数据
a[3].append(6)
a.append(7)
# 输出地址
print(id(a), id(b), id(c)) # 140212335295536 140212335295536 140212335367104
print(a)
print(b)
print(c)
b是赋值所以会和a一模一样,而c是浅复制,所以改变列表中的列表时c会跟着改变,但是增加一个元素时并不会跟着改变。
深复制和浅复制的区别
import copy
a = [1, 2, 3, [4, 5]]
# 浅复制
b = a[:]
# 深复制
c = copy.deepcopy(a)
# 改变原数据
a[3].append(6)
a.append(7)
# 输出地址
print(id(a), id(b), id(c)) # 140212335378752 140212335373280 140212335378912
print(a)
print(b)
print(c)
b是浅复制,会和上述的c相同,而此例子中的c是深复制,并不会有什么改变
使用所有的复制方法来一个
a = [1, 2, 3, [4, 5], "Hello"]
b = a # 赋值
# 浅复制
c = a[:]
d = list(a)
e = a * 1
f = [x for x in a]
g = a.copy()
h = copy.copy(a)
i = copy.deepcopy(a) # 深复制
# 改变
a[3].append(6)
a[4] = "World"
a.append(7)
# 输出
print(a)
print(b)
print(c)
print(d)
print(e)
print(f)
print(g)
print(h)
print(i)
这个例子好好看看,思考思考吧。
以上就是全部内容,若有错误请直接打脸指正!!!
Python赋值、浅复制和深复制的更多相关文章
- Python中的浅复制、深复制
参考 https://docs.python.org/3/library/copy.html?highlight=copy%20copy#copy.copy https://en.wikipedia. ...
- Python学习日记之字典深复制与浅复制
Python中通过copy模块有两种复制(深复制与浅复制) copy 浅复制 复制时只会复制父对象,而不会复制对象的内部的子对象. deepcopy 深复制 复制对象及其子对象 因此,复制后对原dic ...
- Python笔记21-------浅复制和深复制、赋值
上面图表示浅复制和深复制,针对顶层对象来说,赋值为引用,浅复制和深复制都是复制一个新的对象. 针对子对象来说,浅复制为引用.深复制就是复制两个一样的. 1.赋值 A= [ 1,2,3, [ 'a',' ...
- iOS 浅复制和深复制的深层理解,含示例
转载:https://www.zybuluo.com/MicroCai/note/50592 版权归 @MicroCai 所有 以下是正文: 浅复制就是指针拷贝:深复制就是内容拷贝. 集合的浅复制 ( ...
- java基础-浅复制与深复制的理解
浅复制与深复制在很多编程语言中都有出现,那么什么是浅复制,什么是深复制呢? 要区分浅复制与深复制,首先我们要明确什么是复制,怎样才算是复制.复制的例子在生活中也随处可见,如复印一份文档,复制一段文字等 ...
- iOS 浅复制、深复制、完全复制的知识点梳理验证(附加归档解档)
在之前转载的一片文章中,文中对浅复制和深复制进行了详细的解读,同时还提到了深复制(one-level-deep copy).完全复制(true copy)的概念,并指出iOS开发中的深复制是单层深赋值 ...
- 深度解析javascript中的浅复制和深复制
原文:深度解析javascript中的浅复制和深复制 在谈javascript的浅复制和深复制之前,我们有必要在来讨论下js的数据类型.我们都知道有Number,Boolean,String,Null ...
- Java中引用的浅复制和深复制
Java中除了基本类型int,char,double等的赋值是按照值传递之外,其余的类型和对象都是按照引用进行传递的. 下面来看一个关于引用的例子. package referenceCopy;// ...
- 设计模式——浅复制VS深复制
背景 在学习原型模式的时候,採用了一个差别与其它模式的新方法.採用了"克隆(Clone)方法.通过实现ICloneable接口中的Clone()方法来达到克隆的目的. 代码实现过程中,存在了 ...
随机推荐
- python 实现数值积分与画图
import numpy as np from scipy import integrate def half_circle(x): return (1 - x ** 2) ** 0.5 N = 10 ...
- MGRE综合实验
实验要求: 实验拓扑: 一. R1-2-3构建星型结构的MGRE结构,R1为中心站点,假设R1的共有IP为固定地址 1. 配置IP地址 2. 配置缺省 3. 配置MGRE环境 在中心站点上: 在分支站 ...
- 网页客服思路以及QQ截图粘贴到聊天框功能
功能: 1.客服需登录进入客服页面.用户无需登录,进入用户页面,直接获取sessionId作为id值. 2.用户进入页面并且发送消息时,客服才会获取到该用户,并在左侧列表显示. 3.点击用户名即可切换 ...
- C# 数组 ArrayList List<T>区别
System.Collenctions和System.Collenctions.Generic 中提供了很多列表.集合和数组.例如:List<T>集合,数组Int[],String[] . ...
- Blogs实现侧边公告栏设置
说明:只需要在博客侧边栏公告(支持HTML代码) (支持 JS 代码)里面添加如下代码 #1.博客运行时长统计 <!--博客运行时长显示开始--!> <div id="sh ...
- (四)linux的常用环境变量及设置
一.为什么要设置环境变量 1.环境变量能解决什么问题? 你是否经历过输入$python命令后,屏幕上打印出python:command not found的尴尬:每一次都要输入$/home/tools ...
- linux不同环境变量文件的比较,如/etc/profile和/etc/environment
/etc/profile 为系统的每个用户设置环境信息和启动程序,当用户第一次登录时,该文件被执行,其配置对所有登录的用户都有效. 当被修改时,必须重启才会生效.英文描述:"System w ...
- CentOS7的防火墙以及selinux介绍/安装telnet命令/安装netstat与ifconfig命令
简介:firewall防火墙的使用 防火墙:主要用户信息安全防护,主要有软件防火墙和硬件防火墙.firewalld防火墙是软件防火墙,在centos7 之前默认采用的防火墙是iptables,而在ce ...
- 在C#中使用OpenCV(使用GOCW)
在C#中使用OpenCV(使用GOCW) 1.什么是GOCW 为了解决在Csharp下编写OpenCV程序的问题,我做过比较深入的研究,并且实现了高效可用的方法GreenOpenCshar ...
- 卷积网络可解释性复现 | Grad-CAM | ICCV | 2017
觉得本文不错的可以点个赞.有问题联系作者微信cyx645016617,之后主要转战公众号,不在博客园和CSDN更新. 论文名称:"Grad-CAM: Visual Explanations ...