Python基础滚固(六)深浅拷贝的趣谈

先来探究下浅拷贝

 1 a = [1000, [2000, 3000]]
 2 b = a.copy() #来个拷贝
 3 print(a is b)
 4 print(id(a), id(b))
 5 print(id(a[0]) == id(b[0]), id(a[1]) == id(b[1])) #检查第一层每个序列的id是否一致
 6
 7 #输出结果
 8 False #a 与 b 不是同一个
 9 4556627912 4557461256 #a b各自id也不一样
10 True True #a b 各自第一层的每个序列的id竟然是一致的
11
12 #难道‘.copy’就是换汤不换药吗?让我们继续实验下去
13 b[1][0] = 9000  # 改变b[1][0]的值 看看有啥变化
14 b[0] = 7000 #再改变b[0]的值
15 print(a, b)
16 print(id(a[0]) == id(b[0]), id(a[1]) == id(b[1]))#再检查第一层每个序列的id是否一致
17
18 #显示结果
19 [1000, [9000, 3000]] [7000, [9000, 3000]] #改变b的第二层列表元素值后,a的第二层列表元素也改变了,相反第一层a的值却没有改变
20 False True #发现各自第一层的id值不一样了,而第二层依然一样

浅拷贝结论:

浅拷贝就像 中药铺偷秘方一样(印度仿制药),仁济堂偷了同仁堂的祖传秘方,核心药效成分的药材照搬不误,换汤不换药,换个药名,就这么卖了,如果仁济堂改良了核心药方,仁济堂还得继续偷。

再来看看深拷贝

 1 import copy #导入copy模块
 2 c = copy.deepcopy(a) #来个深拷贝
 3 print(a is c) #看看a 与c是否是同一个
 4 print(a, c)
 5 print(id(a), id(c))
 6 print(id(a[0]) == id(c[0]), id(a[1]) == id(c[1]))#检查各a c各层的id是否一致
 7 c[1][0] = 8000 #修改c[1][0]的值
 8 print(a, c)
 9 print(id(a[0]) == id(c[0]), id(a[1]) == id(c[1]))#再检查各a c各层的id是否一致
10
11 #显示结果
12 False #a c不是同一个
13 [1000, [9000, 3000]] [1000, [9000, 3000]] #a c显示结果一样
14 4327133256 4327429064 #a c id不一样
15 True False #a c 第一层id一样 第二层id不一样
16 [1000, [9000, 3000]] [1000, [8000, 3000]] #修改c[1][0]的值后
17 True False #a c 第一层id一样,第二层id不一样

深拷贝结论:

深拷贝 好似 另外一家中药铺 怀仁堂的老板高薪聘请了技术人才(import copy),偷来同仁堂的药方子,把核心药方给技术人才消化吸收,成为怀仁堂自己的知识产权。

以下是官方文件对两者区别的具体说明:

https://docs.python.org/zh-cn/3.7/library/copy.html?highlight=deepcopy#copy.deepcopy

浅层复制和深层复制之间的区别仅与复合对象 (即包含其他对象的对象,如列表或类的实例) 相关: (通俗点说,只要某对象里含有一个嵌套似的对象,那么就会插入这个对象的副本)

  • 一个 浅层复制 会构造一个新的复合对象,然后(在可能的范围内)将原对象中找到的 引用 插入其中。
  • 一个 深层复制 会构造一个新的复合对象,然后递归地将原始对象中所找到的对象的 副本 插入。

深度复制操作通常存在两个问题, 而浅层复制操作并不存在这些问题:

  • 递归对象 (直接或间接包含对自身引用的复合对象) 可能会导致递归循环。
  • 由于深层复制会复制所有内容,因此可能会过多复制(例如本应该在副本之间共享的数据)。

原文地址:https://www.cnblogs.com/yydada/p/11700816.html

时间: 2024-11-13 09:46:42

Python基础滚固(六)深浅拷贝的趣谈的相关文章

python基础(7)--深浅拷贝、函数

1.深浅拷贝 在Python中将一个变量的值传递给另外一个变量通常有三种:赋值.浅拷贝.深拷贝 Python数据类型可氛围基本数据类型包括整型.字符串.布尔及None等,还有一种由基本数据类型作为最基本的元素所组成的像列表.元组.字典等. 在Python中基本数据类型的赋值.深浅拷贝没有任何意义,都是指向同一块内存地址,也不存在层次问题. 下面看基本数据类型的深浅拷贝 import copy n1 = 'abc' n2 = n1 n3 = copy.copy(n1) n4 = copy.deep

Python基础滚固(八)故弄玄虚的迭代器与生成器

我一个初学编程者,第一次看到迭代器,生成器这些名词的时候真的是一脸懵逼,这TMD的到底是个什么鬼?反复研究,查阅资料后,终于把这两个二货给搞明白了. 或许计算机学者们平时一直对着电脑,不太与周围人交流,总爱使用那么拗口的名词,让人无法理解,难道就不能用点通俗点的词汇吗?毕竟计算机科学是一门应用科学啊,脱离了生活,计算机啥都不是. 先来看以下图片 你可能会说,让我看一大堆钱干什么!明明知道我缺钱! 别急!把一张纸钞想象成一个数据,上图是不是就是一大堆散乱的数据呢? 再看下图 装这些 钱(数据)的麻

Python基础滚固(二)有意思的 else

我们在 if 语句中经常使用 else 来做分支判断,今天发现 循环语句 for,while 也可以使用 else 语句来做分支. 1 for i in range(3): 2 print(i) 3 else: 4 print("Good!") 5 6 #输出 可以看出循环遍历后 执行了else语句 7 0 8 1 9 2 10 Good! 11 12 #增加 break 13 for i in range(3): 14 print(i) 15 break 16 else: 17 pr

python基础(9):基本数据类型四(set集合)、基础数据类型补充、深浅拷贝

1. 基础数据类型补充 li = ["李嘉诚", "麻花藤", "?海峰", "刘嘉玲"] s = "_".join(li) print(s) li = "?花?闺?" s = "_".join(li) print(s) 列表: 循环删除列表中的每?个元素 li = [11, 22, 33, 44] for e in li: li.remove(e) print(li

Python 从零学起(纯基础) 笔记 之 深浅拷贝

深浅拷贝 1. import  copy#浅拷贝copy.copy()#深拷贝copy.deepcopy()#赋值 = 2.   对于数字和字符串而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. 对于 字典.元组.列表 而言,进行赋值.浅拷贝和深拷贝时,其内存地址的变化是不同的. 浅拷贝,在内存中只额外创建第一层数据. 深拷贝,在内存中将所有的数据重新创建一份(排除最后一层,即:Python内部对字符串和数字的优化)   1 import copy 2 n1 = {"k1&quo

python之基本数据类型及深浅拷贝

一.数据基本类型之set集合 set和dict类似,也是一组key的集合,但不存储value.由于key不能重复,所以,在set中,没有重复的key set集合,是一个无序且不重复的元素集合 1.创建 s = set() #创建空集合 s = {'values1','values2'} #非空集合 2.转换 l = [1,2,5,11] t = (11,22,12) #元组转集合 st2 = set(t) #列表转集合 st = set(l) print(st) print(st2) 3.常用支

python yield,yield from,深浅拷贝

(一)yield和yield from 转自:理解yield   yield from (1)yield 1.通常的for…in…循环中,in后面是一个数组,这个数组就是一个可迭代对象,类似的还有链表,字符串,文件.它可以是mylist = [1, 2, 3],也可以是mylist = [x*x for x in range(3)]. 它的缺陷是所有数据都在内存中,如果有海量数据的话将会非常耗内存. 2.对比可迭代对象,迭代器其实就只是多了一个函数:__next__(),可以不再使用for循环来

python中的“赋值与深浅拷贝”

Python中,赋值与拷贝(深/浅拷贝)之间是有差异的,这主要源于数据在内存中的存放问题,本文将对此加以探讨. 1 赋值(添加名字) 赋值不会改变内存中数据存放状态,比如在内存中存在一个名为data的数据,此时若执行语句data_01 = data,则现在该份数据有了两个名称(data和data_01),其余都不发生改变,使用任何一个名称对数据进行操作,那么用另外一个名称拿数据时,数据会呈现之间发生的改变.示例如下: 图中,给列表分配了两个名称a与b,对a做改变时b会同样改变,对b做改变时a也会

Python求索之路2——深浅拷贝、函数

一.深浅拷贝 深浅拷贝是指copy模块下的copy()和deepcopy()方法. 1.浅拷贝 示例: >>> import copy >>> a = 'hello word' >>> b = {1:'gome',2:'ahaii',3:[1,2,3,4]} >>> a1 = copy.copy(a) >>> b1 = copy.copy(b) >>> print id(a) 14045817573