深浅拷贝
赋值
- 主要的操作,栈内存的拷贝
- 将一个变量赋值给另一个变量,这个过程叫做赋值。
- 赋值会导致多个变量同时指向一块内存,所以此时不管是==或者 is 都返回 True。当一个发生变化,另一个也会发生变化
- 赋值问题,并不是对象拷贝
>>> a = [1,2,3,4]
>>> b = a
>>> a
[1, 2, 3, 4]
>>> b
[1, 2, 3, 4]
>>> a.append(10)
>>> a
[1, 2, 3, 4, 10]
>>> b
[1, 2, 3, 4, 10]
浅拷贝
- 如果是一个列表,可以使用 ls2 = ls.copy() 在这种方式进行浅拷贝
- 浅拷贝对象,并不是把对象完整的拷贝,而是只拷贝了第一层。如果对象中存储了子对象,那么子对
象还是藕断丝连
>>> a
[1, 2, 3, 4, 10]
>>> c = a.copy()
>>> a
[1, 2, 3, 4, 10]
>>> c
[1, 2, 3, 4, 10]
>>> a.append(15)
>>> a
[1, 2, 3, 4, 10, 15]
>>> c
[1, 2, 3, 4, 10]
#浅拷贝中对象中存储子对象的情况
>>> import copy
>>> a = [1,2,[1,2,3,],4]
>>> b = copy.copy(a)
>>> a
[1, 2, [1, 2, 3], 4]
>>> b
[1, 2, [1, 2, 3], 4]
>>> a.append(10)
>>> b[2].append(5)
>>> a
[1, 2, [1, 2, 3, 5], 4, 10]
>>> b
[1, 2, [1, 2, 3, 5], 4]
深拷贝
深拷贝使用的递归的方式完成的拷贝,这样两个对象之间将没有任何关系
#深拷贝
>>> import copy
>>> a = [1,2,[1,2,3,],4]
>>> b = copy.deepcopy(a)
>>> a
[1, 2, [1, 2, 3], 4]
>>> b
[1, 2, [1, 2, 3], 4]
>>> a.append(10)
>>> b[2].append(5)
>>> a
[1, 2, [1, 2, 3], 4, 10]
>>> b
[1, 2, [1, 2, 3, 5], 4]
copy模块
- 拷贝对象,而对象是存储在堆中的,拷贝堆内存需要得到第二个一样的对象,复制拷贝对象的效率最高
- python为了提供对象拷贝,专门提供了一个copy模块
copy.copy( ) 浅拷贝
copy.deepcopy( ) 深拷贝 - 使用场景:
(1)需要将当前对象进行拷贝的时候,一般建议浅拷贝(速度快,内存消耗少)
(2)如果需要分离关系,使用深拷贝
注意:(1)元组、字符串、数值这些是不可变类型,无论深浅拷贝之后永远只有一份内存
(2)如元组中存在可变类型的元素,浅拷贝之后只有一份内存,深拷贝在之后会产生新的内存,和原对象将没有任何关系
本文详细解释了Python中的赋值、浅拷贝和深拷贝的概念。通过实例演示了不同拷贝方式下对象的变化,以及如何使用copy模块进行对象拷贝。强调了深拷贝与浅拷贝的区别,尤其是在处理包含子对象的复杂数据结构时。
244

被折叠的 条评论
为什么被折叠?



