⬅ 返回
1、赋值
- 被拷贝变量与拷贝变量外层与内层元素内存地址完全一样。
- 资源完全共享,拥有相同的内存地址,一个值改变会被另一个值完全共享。
- 实例:可以用 id(x) 函数查看x的内存地址
l1 = [1,2,3,4,[5,6,7]]
l2 = l1
print(l1,id(l1),l1[4],id(l1[4])) # [1, 2, 3, 4, [5, 6, 7]] 2941816730240 [5, 6, 7] 2941816846592
print(l2,id(l2),l2[4],id(l2[4])) # [1, 2, 3, 4, [5, 6, 7]] 2941816730240 [5, 6, 7] 2941816846592
2、浅拷贝
- 被拷贝变量与拷贝变量外层内存地址不一样,内层内存地址一样。
- 资源半共享,只共享内存的地址。
- 创建新的对象,占用新的内存地址,拷贝第一层的数据,嵌套层会指向原来的内存地址。
- 实例:使用前先导入copy模块,浅拷贝:copy.copy(x)
import copy
l1 = [1,2,3,4,[5,6,7]]
l2 = copy.copy(l1)
print(l1,id(l1),l1[4],id(l1[4])) # [1, 2, 3, 4, [5, 6, 7]] 2534423574784 [5, 6, 7] 2534423458432
print(l2,id(l2),l2[4],id(l2[4])) # [1, 2, 3, 4, [5, 6, 7]] 2534425587904 [5, 6, 7] 2534423458432
3、深拷贝
- 被拷贝变量与拷贝变量外层与内层元素内存地址完全不一样。
- 资源完全不共享,对所有层都创建新的对象(内存地址)。
- 即对外层的数据和内层的数据都创建新的对象。
- 实例:使用前先导入copy模块,深拷贝:copy.deepcopy(x)
import copy
l1 = [1,2,3,4,[5,6,7]]
l2 = copy.deepcopy(l1)
print(l1,id(l1),l1[4],id(l1[4])) # [1, 2, 3, 4, [5, 6, 7]] 1632196868352 [5, 6, 7] 1632196752000
print(l2,id(l2),l2[4],id(l2[4])) # [1, 2, 3, 4, [5, 6, 7]] 1632198357312 [5, 6, 7] 1632198416768
4、可变对象
- 含义:变量对应的值可以修改,但是内存地址不会发生改变。
- 常见的可变对象类型,通常使用内部函数修改该变量的值,而不是直接赋值。
- 实例:
l1 = [1, 2, 3, 4, 5]
print(id(l1)) # l1的内存地址为:1895276329216
l1.append(6)
print(id(l1)) # l1的内存地址为:1895276329216,说明l1是同一个对象,只是内容发生了变化
5、不可变对象
- 含义:变量对应的值不能被修改,如果修改就会生成一个新的值从而分配新的内存地址。
- 上述所提的深浅拷贝只支持不可变对象。
- 常见的不可变对象类型,通常是只能用等号赋值的变量。
- 实例:
n = 100
print(id(n)) # n的内存地址为140728696754392
n=101
print(id(n)) # n的内存地址为140728696754424