返回顶部

深浅copy

一.赋值的操作

# = 相当于复制, 不管怎么改, 值都是相同的
list1 = ['悟空', 'lxx', [1, 2]]
# 二者分隔不开, list1改变list2也跟着改变, 因为指向的是同一个内存地址
list2 = list1  # 这不叫copy, 赋值操作
list1[0] = 'saf'
print(id(list1))
print(id(list2)) # id都是相同的

二.浅copy

list1 = ['悟空', 'lxx', [1, 2]]
# 浅copy 内存地址是不一样的 , 是吧原列表第一层的内存地址不加区分完全copy一份给新列表
list2 = list1.copy()
print(id(list1))
print(id(list2))
list2[0] = '爱是'
list1[2][0] = 0  # 只改变第一层, 第二层内存地址还是一样的 两个列表都会变得
print(list1)
print(list2)

三.深copy(deepcopy)

对于深copy来说,列表是在内存中重新创建的,列表中可变的数据类型是重新创建的,列表中的不可变的数据类型是公用的
# 深copy  两个内存地址是完全不一样的, 区分可变类型
import copy
list1 = ['悟空', 'lxx', [1, 2]]
list2 = copy.deepcopy(list1)
print(id(list1))  # 两个内存地址是完全不一样的
print(id(list2))
​
list1[2][0] = 222
print(list1)
print(list2)

四.相关面试题

l1 = [1, 2, 3, [22, 33]]
l2 = l1[:]  # 这里表示是浅拷贝, 所以结果是一样的
l1[-1].append(666)  # 两个列表的值都会改变
print(l1)
print(l2)

五.总结

# 浅copy: list dict: 嵌套的可变的数据类型是同一个
# 深copy: list dict: 嵌套的可变的数据类型不是同一个
posted @ 2022-07-20 16:07  fuju  阅读(46)  评论(0)    收藏  举报