Ⅵ:深浅copy

什么是深浅拷贝

  • 浅拷贝:是把原列表第一层的内存地址完全拷贝一份给新列表。即只能保证对原列表中第一层地址(不可变类型)的改操作不受影响,涉及到原列表中第二层地址(可变类型)的改操作时,原列表变,新列表也跟着变-
    cmd-markdown-logo
  • 深拷贝:将两个列表的改操作完全的独立开。即不管原列表对第几层地址的改操作,新列表都不受影响,保持最开始复制的列表元素不变。
    cmd-markdown-logo

怎么用深浅拷贝?

'''
浅拷贝:列表中的不可变类型元素改变,新列表中的不可变类型元素不变,
列表中的可变类型元素改变,新列表的不可变类型元素也跟着变
'''
list1 = ['Umi', 2233, ['Egon', 'Alex']]
list2 = list1.copy()
print('list1:', id(list1), id(list1[0]), id(list1[1]), id(list1[2]))
print('list2:', id(list2), id(list2[0]), id(list2[1]), id(list2[2]))
print(list1)    # ['Umi', 2233, ['Egon', 'Alex']]
print(list2)    # ['Umi', 2233, ['Egon', 'Alex']]

# 对于不可变类型的赋值、都是产生了新值,让原列表的索引指向新的内存地址、并不会影星新列表
list1[0] = 'UMI'
list1[1] = 21
'''
但对于可变类型,我们可以改变可变类型中包含的值,但内存地址不变,
即原列表的索引指向仍然指向原来的内存地址,
于是新列表也跟着受影响,如下
'''
list1[2][0] = 'EGON'
list1[2][1] = 'ALEX'
print(list1)    # ['UMI', 21, ['EGON', 'ALEX']]
print(list2)    # ['Umi', 2233, ['EGON', 'ALEX']]


# 深拷贝
import copy
list1 = ['Umi', 2233, ['Egon', 'Alex']]
list2 = copy.deepcopy(list1)
#                  不可变        不可变          可变
print('list1:', id(list1[0]), id(list1[1]), id(list1[2]))
print('list2:', id(list2[0]), id(list2[1]), id(list2[2]))

list1[0] = 'UMI'
list1[1] = 21
list1[2][0] = 'EGON'
list1[2][1] = 'ALEX'
print(list1)    # ['UMI', 21, ['EGON', 'ALEX']]
print(list2)    # ['Umi', 2233, ['Egon', 'Alex']]

猜你喜欢

转载自www.cnblogs.com/qujiu/p/12453719.html
今日推荐