python - 浅拷贝

前言

在Python中一切皆对象,任何对象都有三个属性:唯一标识、类型、值。

id() ,是Python的一个内置函数,返回对象的唯一标识,用于获取对象的内存地址。

对于某个对象,如何创建它的拷贝,就是说如何创建与该对象具有相同值的另外一个对象?

L1 = [[1, 2], 9]
L2 = L1[:]  # 使用切片
print(L2)  # [[1, 2], 9]

判断 L1 和 L2 是否使用了相同的内存地址。

L1 = [[1, 2], 9]
L2 = L1[:]
print(L2)  # [[1, 2], 9]

print("L1内存地址:%s" % id(L1))  # 3757064
print("L2内存地址:%s" % id(L2))  # 31379592

由此可见,L1和L2使用了不同的内存地址。


判断 L1 和L2 中对应的两个元素引用的列表对象是否一样

L1 = [[1, 2], 9]
L2 = L1[:]
print(L2)  # [[1, 2], 9]
print("L1[0]内存地址:%s" % id(L1[0]))  # 1856008
print("L2[0]内存地址:%s" % id(L2[0]))  # 1856008

print("L1[1]内存地址:%s" % id(L1[1]))  # 8791123393856
print("L2[1]内存地址:%s" % id(L2[1]))  # 8791123393856

列表 L1 和 L2 中的整数对象的内存地址是一样的。

浅拷贝
对于某个对象,虽然创建了与该对象具有相同值的另外一个对象,但是这两个对象内部嵌套的对应子对象全部都是同一个对象。就是说外部进行了拷贝,内部没有进行拷贝。


总结

以下方式得到的拷贝都是浅拷贝:
1、切片操作
2、调用列表、字典、集合的操作 copy
3、调用标准库模块copy中的copy

L2 = L1.copy()
L2 = list(L1)
L2 = copy.copy(L1)

得到的结果都是一样的

不可变对象: 字符串、元祖、整数等
可变对象:列表、字典

修改列表对象:

L1 = [[3, 6], 8]
L2 = L1[:]

L1[0][1] = 7
L1[1] = 9
print(L1)  # [[3, 7], 9]
print(L2)  # [[3, 7], 8]

总结:

1、对不可变对象拷贝时,浅拷贝不开辟新空间,相当于赋值操作。
2、浅拷贝在拷贝时,只会copy一层,在内存中开辟一个空间,存放这个copy的列表。更深的层次并没有copy,即第二层用的都是同一个内存。
3、可变对象浅拷贝时,只拷贝第一层中的引用。

------分界线------

成功的背后,是做 难 而正确的事,
什么是正确的事?
呐 像这, 读书,写文章。
posted @ 2021-10-27 19:22  西瓜_皮  阅读(193)  评论(0编辑  收藏  举报