python之深浅拷贝

list1 = ['egon', 'lxx', [1,2]]
list2 = list1 #这不叫copy 二者分隔不开,list改list2也跟着改,因为指向的就是同一个地址

拷贝:拷贝指的是拷贝原列表产生新的列表(id 是不同的)

浅拷贝:

list1 = ['egon', 'lxx', [1,2]]
list3 = list1.copy() #浅拷贝

什么是浅拷贝:

​ 是把原列表第一层的内存地址不加区分(可变和不可变元素)完全 copy 一份给新列表

list1=[
    'egon',
    'lxx',
    [1, 2]
]
list3 = list1.copy()
print(list3) #['egon', 'lxx', [1, 2]]
print(id(list1)) #4328662792
print(id(list3)) #4328845576
print(list3[0], list3[1], list3[2])
print(id(list3[0]), id(list3[1]), id(list3[2]))
'''
不可变       不可变         可变   
egon         lxx        [1, 2]
4562892312 4564357336 4564371656
'''
list1[0] = 'EGON'
list1[1] = 'LXX'
list1[2][0] = 111
list1[2][1] = 222
print(list3[0], list3[1], list3[2])
print(id(list3[0]), id(list3[1]), id(list3[2]))
'''
egon        lxx       [111, 222]
4562892312 4564357336 4564371656
'''

image-20200309170144443

总结:

1、对于不可变类型的赋值,都是产生了新值,让原列表的索引指向新的内存地址,并不会影响新列表

2、对于不可变类型时,会改变可变类型中包含元素的值,但元素的内存地址不变

也就是说,浅拷贝只是拷贝的原列表的第一层,其内部每个元素还是指向同一个内存地址。

深拷贝:

​ 深拷贝是对每一层都拷贝,对可变及不可变类型都加以区分

import copy
list1=[
    'egon',
    'lxx',
    [1,2]
]

list3 = copy.deepcopy(list1)
print(id(list1[0]),id(list1[1]),id(list1[2]))
print(id(list3[0]),id(list3[1]),id(list3[2]))
'''
4519556632 4521021656 4520863496
4519556632 4521021656 4521049096
'''
list1[0]='EGON'
list1[1]='LXX'
list1[2][0]=111
list1[2][1]=222
# print(list1)
print(list3) #['egon', 'lxx', [1, 2]]

深拷贝

总结:

深拷贝是区分可变类型与不可变类型的copy机制

也就是说深拷贝是完全拷贝原列表的所有层

如果想要针对改操作,完全独立开两个列表,用 copy.deepcopy()

原文地址:https://www.cnblogs.com/xy-han/p/12450303.html