python 深浅拷贝

python

浅拷贝

l1 = [1, 'a', [4, 5, 6]]

print(l1) #[1, 'a', [4, 5, 6]]

print(id(l1)) #163373256

print(id(l1[0])) #1622830560

l2 = l1.copy() # [1, 'a', [4, 5, 6]]

l2[2][0] = 4444

print(l2) #[1, 'a', [4444, 5, 6]]

print(id(l2)) #163375624

print(id(l2[0])) #1622830560

print("l1:", l1) #l1: [1, 'a', [4444, 5, 6]]

print("id_l1:", id(l1)) #id_l1: 163373256

原理: 手绘!

  因为浅拷贝,只是创建了新的内存地址,简单拷贝了原列表第一层所有元素指向的地址。 所以两个列表内元素指向的是都是相同id。

  其中第三个元素[4, 5, 6]是可变类型,指向一个4,5,6三个元素集合的地址。若其中元素变化,不影响第三个元素[4, 5, 6]的id。l1和l2第三个元素依然指向相同的id。

  所以当l1中列表元素发生变化,l2中列表同样发生变化

深拷贝

import copy

l1 = [1, 'a', [4, 5, 6]]

print(l1) #[1, 'a', [4, 5, 6]]

print('id(l1[0]):',id(l1[0])) #1622830560

print('id(l1[2]):',id(l1[2])) #162961416

print(id(l1)) #163373256

# print(id(l1[0]))

l2 = copy.deepcopy(l1) # [1, 'a', [4, 5, 6]]

print('id(l2[0]):',id(l2[0])) #1622830560 不可变类型ip地址相同

print('id(l2[2]):',id(l2[2])) #163375432 可变类型ip地址发生变化

l2[2][0] = 4444

print(l2) #[1, 'a', [4444, 5, 6]]

print(id(l2)) #163375624

print("l1:", l1) #l1: [1, 'a', [4, 5, 6]]

print("id_l1:", id(l1)) #id_l1: 163373256

 原理:

  经过测试,l1和l2的ip地址是相同的。但是其中不可变的列表元素ip地址是不同的。

  深拷贝是把可变元素完全复制,而不可变元素指向地址保持一致。节约了空间,妙啊!

以上是 python 深浅拷贝 的全部内容, 来源链接: utcz.com/z/386897.html

回到顶部