深浅copy

id(object) 获取对象的内存地址

is 判断是否是同一个内存空间  == 判断值是否相同

a = [1,2,3,]
b = a[:]         # 相当于是浅copy,b指向了一个新的内存空间,但新内存空间中保存的内存地址还是指向了数组[1,2,3,]
c = a            # c和a指向了同一块内存空间
print(a is b)    # False
print(a is c)    # True
print(a==b)      # True

同一代码块下的缓存机制、不同代码块下的小数据池(字符串、bool、数值)

1.赋值,指向同一块内存空间

a={'n':1}
b=a                  # a和b不是独立的对象
print(id(a), id(b))  # 2470858078792 2470858078792
a={'n':2}
print(id(a), id(b))  # 2470858079672 2470858078792

2.浅copy(当里面有可变数据类型时会导致混乱,对不可变数据类型没影响)

会开辟一个新的内存空间,但是存储的都是数据的内存地址,这些内存地址都指向同一块内存空间。(当有可变数据类型时,也就是会指向可变数据类型的内存地址)

a = [1, 2, 3, 4, [1, 2, 3]]
b = a.copy()  # a[:]   
a.append(5)
print(a)  # [1, 2, 3, 4, [1, 2, 3], 5]
print(b)  # [1, 2, 3, 4, [1, 2, 3]]
a[4].append(4)
print(a)  # [1, 2, 3, 4, [1, 2, 3, 4], 5]
print(b)  # [1, 2, 3, 4, [1, 2, 3, 4]]
print(id(a[0]),id(a[4]))  # 140728064385424 3202058800968   和下面的深copy进行对比
print(id(b[0]),id(b[4]))  # 140728064385424 3202058800968

3.深copy(互相不影响)

可变的数据类型重新创建一份;不可变的数据类型公用,与之前内存地址指向的内存空间相同

from copy import deepcopy

a = [1, 2, 3, 4, [1, 2, 3]]
b = deepcopy(a)
a.append(5)
print(a)  # [1, 2, 3, 4, [1, 2, 3], 5]
print(b)  # [1, 2, 3, 4, [1, 2, 3]]
a[4].append(4)
print(a)  # [1, 2, 3, 4, [1, 2, 3, 4], 5]
print(b)  # [1, 2, 3, 4, [1, 2, 3]]
print(id(a[0]),id(a[4]))  # 140728064385424 3202056259720
print(id(b[0]),id(b[4]))  # 140728064385424 3202058801096
原文地址:https://www.cnblogs.com/pineapple-chicken/p/13235015.html