10.深浅拷贝

1.赋值
l1=[1,2,3,4,[5,6,7]]
l2=l1 #赋值 赋值不是拷贝
l1.append(8)
print(l1)
print(l2)
2.浅拷贝
l1=[1,2,3,4,[5,6,7]]
l2=l1[:]#浅拷贝
l2=l1.copy()#浅拷贝---只拷贝第一层
print(id(l1[0]))#内存地址相同
print(id(l2[0]))#内存地址相同
浅拷贝会创建一个新的列表(容器),
新创建的列表中的元素和原列表的元素用的是同一内存空间
l1 = [1,2,3,4]
l2 = l1.copy()
print(l1)
print(id(l1))
print(id(l2))
print(id(l1[0]))
print(id(l2[0]))
两个容器的内存地址不同,里面与元素的内存地址相同
例1:
li = [1,2,32,[3,4,5]]
l2 = li.copy()
li.append(8)
print(l2)#[1, 2, 32, [3, 4, 5]]
print(li)#[1, 2, 32, [3, 4, 5], 8]

li[-1].append(8)
print(l2)#[1, 2, 32, [3, 4, 5, 8]]
print(li)#[1, 2, 32, [3, 4, 5, 8]]
例2:
l1 = [1,2,3,(1,2,3)]
l2 = l1.copy()
l2[-1] = 6
print(l1)  # 不变[1,2,3,(1,2,3)]
print(l2)  # 不变[1,2,3,6] 改变了列表中最后一个元素的指向关系
l1 = [1,2,3,4,[5,6,7,]]
l2 = l1.copy()
l1[-1].append(8)
print(l2)  #[1,2,3,4,[5,6,7,8]]
3.深copy
import copy
li = [1,2,3,4,5,[6,7,8]]
l2 = copy.deepcopy(li)
print(li)
# print(id(li))
print(id(li[-1]))
print(l2)
# print(id(l2))
print(id(l2[-1]))
深拷贝 --
  不可变的数据类型和原列表指向同一个空间
  可变数据会创建一个新的空间
1.
import copy
li = [1,2,3,4,5,[6,7,8]]
l2 = copy.deepcopy(li)
li[-1].append(678)
print(li)#[1, 2, 3, 4, 5, [6, 7, 8, 678]]
print(l2)#[1, 2, 3, 4, 5, [6, 7, 8]]
2.
import copy
li = [3,4,5,[1,2,3,4],6,7,8,{"k":'v'}]
l2 = copy.deepcopy(li)
li[-1]['k'] = "a"
print(li)
print(l2)

例1:

dic = {}   # "v":4
li = []    #[{"v":0},{"v":1},{"v":2},{"v":3},{"v":4}]
for i in range(0,5):
    dic["v"] = i
    li.append(dic)
print(li)
>>>[{'v': 4}, {'v': 4}, {'v': 4}, {'v': 4}, {'v': 4}]
原文地址:https://www.cnblogs.com/pythonblogs/p/11004938.html