列表之间的赋值
list1 = [1, 2, 3, 4]
list2 = list1
print(id(list1), id(list2))
foriinrange(len(list1)):
list1[i] += 1 # list1列表中元素值加1
print(list1)
print(list2) # 值相同
# 结果:
#2075877310080 2075877310080
#[2, 3, 4, 5]
#[2, 3, 4, 5]
分析:列表的赋值相当于取别名,即两者名称都指向同一个堆栈区地址列表对象,操作任意一个,另一个同步变化
列表浅拷贝
list1 = [1, 2, 3, 4]
list2 = list1.copy() # list2是list1的浅拷贝
print(id(list1), id(list2))
foriinrange(len(list1)):
list1[i] += 1 # list1列表中元素值加1
print(list1)
print(list2) # 内容不同
# 结果:
#19482213712641948221337984
#[2, 3, 4, 5]
#[1, 2, 3, 4]
分析:list2是列表list1的浅拷贝结果,id值与list1列表不同,这是因为通过浅拷贝时会产生一个新的地址列表与list2绑定,与list1地址列表完全不同,地址不同相互隔离。
注意:列表中有可变数据类型进行浅拷贝时无效,如:
list1 = [1, 2, [3, 4]]
list2 = list1.copy() # list2是list1的浅拷贝
print(id(list1), id(list2))
list1[0]+=1
list1[1]+=1
list1[2][0]+=1
list1[2][1]+=1
print(list1)
print(list2)
print(id(list1[2]))
print(id(list2[2]))
#1641019701760 1641022529984
#[2, 3, [4, 5]]
#[1, 2, [4, 5]]
#1641019735680
#1641019735680
分析:list1列表有2个不可变的数据元素1和2,其进行改变并没有影响list2,但list1中可变元素[3,4]若改变则list2也会随之改变,list1与list2并没有完全隔离开来,虽然list1与list2的内存总的地址列表项相互独立但列表第三项绑定了同一个字列表,不能实现完全的地址隔离,若需要完全独立则需要深拷贝。
深拷贝
importcopy
list1 = [1, 2, [3, 4]]
list2 = copy.deepcopy(list1) # list2是list1的深拷贝
print(id(list1), id(list2))
list1[0]+=1
list1[1]+=1
list1[2][0]+=1
list1[2][1]+=1
print(list1)
print(list2)
print(id(list1[2]))
print(id(list2[2]))
#2340374568832 2340374954048
#[2, 3, [4, 5]]
#[1, 2, [3, 4]]
#2340374568256
#2340377828864
分析:通过深拷贝,字列表进行隔离,从实现与原列表真正的完全隔离