num1 = [1, 2, 3]
num2 = num1 # 将num1的地址值复制给了num2
num1.append(4)
num2.append(5) # 无论num1或num2谁添加,都是一个内容(存储的地址内容)改变
print(num1, id(num1))
print(num2, id(num2)) #id看地址相同
num2 = num1
把num1堆内存的地址给了num2,num1和num2指定储存地址内容是相同的,无论谁改变新的内容,都是在同一个堆内存改变新的值,所以改变内容相同,id相同。
输出为:
[1, 2, 3, 4, 5] 1407260545856
[1, 2, 3, 4, 5] 1407260545856
# 浅copy 只copy列表的一级元素,复制了嵌套的可变数据类型的地址
num1 = [1, [2, 3]]
num2 = num1.copy()
print(num1, id(num1))
print(num2, id(num2))
num1.append(4)
num2.append(5)
num1[1].append(6)
print(num1, id(num1))
print(num2, id(num2))
print("num1[0]:", num1[0], id(num1[0]))
print("num2[0]:", num2[0], id(num2[0]))
print("num1[1]:", num1[1], id(num1[1]))
print("num2[1]:", num2[1], id(num2[1]))
num2 = num1.copy() 只能复制一级地址。num1和num2的堆地址不同,所以id不同,在一级地址内增加的内容,根据不同增加的内容,各自增加各自的。但是如果不是一级地址,比如增在[2,3],这不是一级地址了,他们的的堆地址是相同的,所以会一起改变,内容发生改变。
输出为:
[1, [2, 3]] 2422347255616
[1, [2, 3]] 2422347256064
[1, [2, 3, 6], 4] 2422347255616
[1, [2, 3, 6], 5] 2422347256064
num1[0]: 1 140705941997216
num2[0]: 1 140705941997216
num1[1]: [2, 3, 6] 2422347256640
num2[1]: [2, 3, 6] 2422347256640
# 深拷贝 能够copy列表所有层次的元素,复制了嵌套的可变数据类型元素
import copy
num1 = [1, [2, 3]]
num2 = copy.deepcopy(num1)
num1.append(4)
num2.append(5)
num1[1].append(6)
print(num1, id(num1))
print(num2, id(num2))
print("num1[0]:", num1[0], id(num1[0]))
print("num2[0]:", num2[0], id(num2[0]))
print("num1[1]:", num1[1], id(num1[1]))
print("num2[1]:", num2[1], id(num2[1]))
num2 = num1.deepcopy 复制了所有层次的元素,除了最终得内存地址(元素的储存地址)相同,其他的内存地址都不相同,所以各自更改,互不影响。
输出为:
[1, [2, 3, 6], 4] 1657409099136
[1, [2, 3], 5] 1657409073984
num1[0]: 1 140705941997216
num2[0]: 1 140705941997216
num1[1]: [2, 3, 6] 1657409098880
num2[1]: [2, 3] 1657409099456