python的赋值、浅拷贝和深拷贝
"""
一、赋值在python中就是简单的对象引用
"""
list_a = ["aaa", "bbb"]
list_b = list_a
print(id(list_a), id(list_b)) # 输出 2127728239240 2127728239240 # 通过上面操作可以看出,list_b和list_a指向同一片内存,list_b不过是list_a的别名,是引用,除了list_b这个名字以外,没有其它的内存开销。。
# 修改了list_a,就影响了list_b;同理,修改了list_b就影响了list_a list_b[1] = "ccc"
print(f"list_a = {list_a}") # 输出 list_a = ['aaa', 'ccc']
print(f"list_b = {list_b}") # 输出 list_b = ['aaa', 'ccc'] """
二、浅拷贝
在浅拷贝时,拷贝出来的新对象的地址和原对象是不一样的,但是新对象里面的可变元素(如列表)的地址和原对象里的可变元素的地址是相同的,也就是说浅拷贝它拷贝的是浅层次的数据结构(不可变元素),对象里的可变元素作为深层次的数据结构并没有被拷贝到新地址里面去,
而是和原对象里的可变元素指向同一个地址,所以在新对象或原对象里对这个可变元素做修改时,两个对象是同时改变的。
"""
list_c = ["aaa", "bbb"]
list_d = list_c.copy()
print(id(list_c), id(list_d)) # 输出 1803491942920 1803491976008
# 通过id可以看出,发现它们也不指向同一片内存,也就是说浅拷贝产生的list_d不再是list_c了,使用is也可以发现他们不是同一个对象。 for x in list_c:
print(id(x)) # 输出 "aaa" = 1803491959280 "bbb" = 1803491948000
for y in list_d:
print(id(y)) # 输出 "aaa" = 1803491959280 "bbb" = 1803491948000
# 但是当我们查看元素的id时,可以看到两个对象包含的元素的地址是相同的。 list_d[1] = "ccc"
print(f"list_c = {list_c}") # 输出 list_c = ['aaa', 'bbb']
print(f"list_d = {list_d}") # 输出 list_d = ['aaa', 'ccc']
# 在这种情况下,list_c和list_d是不同的对象,修改list_d理论上不会影响list_c。 list_e = [["aaa", "bbb"], "ccc"]
list_f = list_e.copy()
list_f[0][1] = "ccc"
print(f"list_e = {list_e}") # 输出 list_e = [['aaa', 'ccc'], 'ccc']
print(f"list_f = {list_f}") # 输出 list_e = [['aaa', 'ccc'], 'ccc']
# 但是要注意,浅拷贝之所以称为浅拷贝,是它仅仅只拷贝了一层,在list_a中有一个嵌套的list,如果我们修改了它,情况就不一样了。
# 通过list_f[0][1] = "ccc" 修改list_f后,将发现list_e也发生了变化。这是因为,修改嵌套的元素的内存地址是一样,与前面赋值原理一样。
"""
三、深拷贝 深拷贝只有一种形式,copy模块中的deepcopy函数。
和浅拷贝对应,深拷贝拷贝了对象的所有元素,包括多层嵌套的元素。因而,它的时间和空间开销要高。
同样对list_a,若使用list_b = copy.deepcopy(list_a),再修改list_b将不会影响到list_a了。即使嵌套的列表具有更深的层次,也不会产生任何影响。
因为深拷贝出来的对象根本就是一个全新的对象,不再与原来的对象有任何关联。
"""
"""
### 关于拷贝的警告
1、对于非容器类型,如数字,字符,以及其它“原子”类型,没有拷贝一说。产生的都是原对象的引用。
2、如果元组变量值包含原子类型对象,即使采用了深拷贝,也只能得到浅拷贝。
"""

四、浅拷贝与深拷贝中的注意点
- 列表的切片以及字典的copy方法都是浅拷贝


- 如果对一个全部都是不可变类型的数据用copy.copy()或copy.deepcopy()进行拷贝,他们结果相同,都是引用指向。

- 如果拷贝的是一个拥有可变类型的数据,即使元组是最顶层,那么deepcopy依然是 深拷贝,而copy.copy()拷贝的还是指向

python的赋值、浅拷贝和深拷贝的更多相关文章
- 对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解
引用:https://www.jb51.net/article/142775.htm 列表赋值: 1 2 3 4 5 6 7 >>> a = [1, 2, 3] >>&g ...
- 16.python中的浅拷贝和深拷贝
在讲什么是深浅拷贝之前,我们先来看这样一个现象: a = ['scolia', 123, [], ] b = a[:] b[2].append(666) print a print b
- Python 引用、浅拷贝、深拷贝解析
引用 Python是动态数据类型的语言,故在对变量进行赋值时是不用制定变量类型的. 或者说,你可以把变量赋值的过程,当作是贴一个标签,去引用该数据. 看下面的例子: In [54]: a=4 In [ ...
- python 基础之浅拷贝与深拷贝
浅拷贝与深拷贝 1.普通赋值 例1: a = 15b = aa = 16print(b)#例2:lst1 = [1,2,3]lst2 = lst1lst1.append(4)print(lst2)#这 ...
- python 进阶篇 浅拷贝与深拷贝
阐述引用.浅拷贝和深拷贝前,首先需要要了解 Python 的世界里,一切皆对象,每个对象各包含一个 idendity.type 和 value. 引用(Reference) >>> ...
- python中的浅拷贝,深拷贝
直接引用,间接引用 # 1.列表存储的是索引对应值的内存地址,值会单独的开辟一个内存空间 list = ["a","b"] 内存里面存储的就是list[0],l ...
- python中赋值-浅拷贝-深拷贝之间的关系
赋值: 变量的引用,没有拷贝空间 对象之间赋值本质上 是对象之间的引用传递而已.也就是多个对象指向同一个数据空间. 拷贝的对象分两种类型: . 拷贝可变类型 浅拷贝: 只拷贝第一层数据,不关心里面的第 ...
- python中的浅拷贝和深拷贝
1.赋值语句 a = 'abc' b = a print id(a) print id(b) # id(a):29283464 # id(b):29283464 通过简单的复制,我们可以看到,a b其 ...
- Python核心编程--浅拷贝与深拷贝
一.问题引出浅拷贝 首先看下面代码的执行情况: a = [1, 2, 3] print('a = %s' % a) # a = [1, 2, 3] b = a print('b = %s' % b) ...
- Python中的浅拷贝与深拷贝
编者注:本文主要参考了<Python核心编程(第二版)> 以下都是参考资料后,我自己的理解,如有错误希望大家不吝赐教. 大家有没有遇到这样一种情况,对象赋值后,对其中一个变量进行修改,另外 ...
随机推荐
- SpringBoot项目找不到主类或无法加载主类
问题描述 启动springboot项目的时候发现启动失败,查看日志发现因为找不到主类或无法加载主类. 解决 我这个项目是拉取的别人git上的项目,看了一下目录结构发现没有编译后的文件(target目录 ...
- 【Java 基础】Java Enum
概览 在本文中,我们将看到什么是 Java 枚举,它们解决了哪些问题以及如何在实践中使用 Java 枚举实现一些设计模式. enum关键字在 java5 中引入,表示一种特殊类型的类,其总是继承jav ...
- 三维引擎导入obj模型不可见总结
最近有客户试用我们的三维平台,在导入模型的时候,会出现模型全黑和不可见的情况.上一篇文章说了全黑的情况.此文说下不可见的情况. 经过测试,发现可能有如下两种情况. 导入的模型不在镜头视野内 导入的模型 ...
- 测试工具_webbench
目录 一.简介 二.例子 一.简介 Webbench是知名的网站压力测试工具,能测试处在相同硬件上,不同服务的性能以及不同硬件上同一个服务的运行状况. webbench的标准测试可以向我们展示服务器的 ...
- MySQL查询数据库表空间大小
一.查询所有数据库占用空间大小 SELECT TABLE_SCHEMA, CONCAT( TRUNCATE(SUM(data_length) / 1024 / 1024, 2), ' MB' ) AS ...
- Python 如何管理类的创建行为
问题 如果我们要给类加上一个属性,只需在定义的时候加上属性就可以了: class Animal: can_fly = True 如果这样的类有很多,我们可以定义一个父类,让其它类继承他就可以了: cl ...
- [BUUCTF]REVERSE——Youngter-drive
Youngter-drive 附件 步骤: 例行查壳儿,32位程序,upx壳儿 利用网上找的upx脱壳儿工具脱完壳扔进ida,首先检索程序里的字符串,发现了有关flag的字样,跟进,当source=T ...
- 2020信息安全铁人三项 pwn复盘
第一赛区 hacknote 程序存在格式化字符串漏洞和uaf,不多说了,很简单. 1 from pwn import * 2 3 p = process('./hacknote') 4 elf = E ...
- HTTP状态码一览表
常见Http状态码大全 2018年03月16日 11:36:31 阅读数:153 一些常见的状态码为: 200 - 服务器成功返回网页404 - 请求的网页不存在503 - 服务不可用详细分解: 1x ...
- Photoshop学习笔记(一)
1.Alt+delete,用前景色填充选区 2.按住shift键可以新加选区 3.按住alt键可以减去选区 4.第一次选择选区时按住shift键制作出正方形或者圆形 5.第一次选择选区时按住alt键将 ...