python深浅拷贝内存空间的角度解析


# 对于可变变量(列表和字典):每一个变量都会分配一个内存地址,变量中每一个元素也对应一个内存地址,当改变变量中的某一个元素值时,
# 若该元素是变量中最小单元,则该元素的内存地址会发生变化,否则内存地址不会变化
# 即:可变变量被修改时,只会修改被修改元素所在的最小单元的内存地址
# eg:a=[1,2,3], id(a)!=id(a[0])!=id(a[1])!=id(a[2])
# 修改a[0]=111 --> id(a)值不变,id(a[0])值改变,id(a[1])、id(a[2])值不变
# x=[[1,2,3],[4,5,6]],id(x)!=id(x[0])!=id(x[0][0])!=id(x[0][1])!=id(x[1]).....
# 修改x[0][0]=111 -->id(x[0][0])值会变,其他都不会边id(x)不变、id(x[0])不变、id(x[1])不变、id(x[0][1])不变.....

# 1、普通赋值 = ,赋值是引用,具有传递作用,引用的是全部内存地址
a = [[1, 2, 3], [4, 5, 6]]
b = a
print(a) # -->[[1, 2, 3], [4, 5, 6]]
print(b) # -->[[1, 2, 3], [4, 5, 6]],id(a) = id(b)、id(a[0]) = id(b[0])、id(a[0][0]) = id(b[0][0])...
a.append(8)
print(a) # -->[[1, 2, 3, 8], [4, 5, 6]]
print(b) # -->[[1, 2, 3, 8], [4, 5, 6]],原因:id(a) = id(b)、id(a[0]) = id(b[0])、id(a[0][0]) = id(b[0][0])...

# 2、浅拷贝copy.copy(),拷贝的是一块内存地址
a = [1, 2, 3]
b = copy.copy(a)
print(a) # -->[1, 2, 3]]
print(b) # -->[1, 2, 3]],id(a) != id(b)、id(a[0]) = id(b[0])、id(a[1]) = id(b[1])、id(a[2]) = id(b[2])
a.append(8)
print(a) # -->[1, 2, 3, 8]
print(b) # -->[1, 2, 3],原因:id(a) != id(b)

a = [[1, 2, 3], [4, 5, 6]]
b = copy.copy(a)
print(a) # -->[[1, 2, 3], [4, 5, 6]]
print(b) # -->[[1, 2, 3], [4, 5, 6]],id(a) != id(b)、id(a[0]) = id(b[0])、id(a[0][0]) = id(b[0][0])...
a[0].append(8)
print(a) # -->[[1, 2, 3, 8], [4, 5, 6]]
print(b) # -->[[1, 2, 3, 8], [4, 5, 6]],原因:id(a[0]) = id(b[0])

a.append(8)
print(a) # -->[[1, 2, 3, 8], [4, 5, 6], 8]
print(b) # -->[[1, 2, 3, 8], [4, 5, 6]],原因:id(a) != id(b)

# 3、深拷贝copy.deepcopy(),拷贝的只有值
a = [1, 2, 3]
b = copy.deepcopy(a)
print(a) # -->[1, 2, 3]]
print(b) # -->[1, 2, 3]],id(a) != id(b)、id(a[0]) != id(b[0])、id(a[1]) != id(b[1])、id(a[2]) != id(b[2])
a.append(8)
print(a) # -->[1, 2, 3, 8]
print(b) # -->[1, 2, 3],原因:id(a) != id(b)

a = [[1, 2, 3], [4, 5, 6]]
b = copy.deepcopy(a)
print(a) # -->[[1, 2, 3], [4, 5, 6]]
print(b) # -->[[1, 2, 3], [4, 5, 6]],id(a) != id(b)、id(a[0]) != id(b[0])、id(a[0][0]) != id(b[0][0])...
a[0].append(8)
print(a) # -->[[1, 2, 3, 8], [4, 5, 6]]
print(b) # -->[[1, 2, 3], [4, 5, 6]],原因:id(a[0]) != id(b[0])

a.append(8)
print(a) # -->[[1, 2, 3, 8], [4, 5, 6], 8]
print(b) # -->[[1, 2, 3], [4, 5, 6]],原因:id(a) != id(b)






posted @ 2022-07-03 17:10  菜花小兔  阅读(84)  评论(0编辑  收藏  举报