深拷贝 浅拷贝
都是拷贝,不存在快捷方式
——目的:避免一些隐藏的错误
——比如这样的代码:
# 传入的list为dd1 = dd[:]
# 这样改变dd1就不会改变dd的值
def func(l):
l.append(4)
l[3].append(5)
my_list = [1,2,3,[]]
func(m_list[:])
print(my_list)
-
浅拷贝:
-
list = list[:] —— 切片操作
-
是指重新分配一块内存,如果源对象不可变,深还是浅都一样
-
只拷贝了外边的壳子
-
源对象
-
b = copy.copy(a)
-
list【list】,(对于可变的数据)浅拷贝可能会有副作用
-
不可变的数据类型,保存的地址是一样的:
-
# tuple是不可变数据结构(体现在id上) >>>1 True True 2 True True 3 True True
-
-
深拷贝:
- b = a
- 里里外外都拷贝进去了
- 以递归的方式查找,所以也会出现一些问题
a == b: | a is b | |
---|---|---|
判断a和b分别的value | 判断分别的id值(少用) | |
元组里列表的值变=元组变 | 》=-255 & 《 =256 (大小可缓存的) |
代码问题:
存储角度看:
两个list的地址是不一样的。
append后,first里的子列表会又多了一个5