前言
在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、可变对象浅拷贝时,只拷贝第一层中的引用。
------分界线------
成功的背后,是做 难 而正确的事,
什么是正确的事?
呐 像这, 读书,写文章。