目录
探究问题
探究python的切片操作属于深拷贝还是浅拷贝
知识扫盲
1、直接赋值
num1 = [1, 2, 3]
num2 = num1
num1.append(4)
print(num2)
- 结果分析
直接将num1赋值给num2,等于把重新开辟一个num2的栈内存,并让num2指向num1指向的堆内存地址。
2、浅拷贝
num1=[10,[2,3]]
num2=num1.copy()
num1.append(4)
num1[0]=8
num1[1].append(100)
print(num1,id(num1))
print(num2,id(num2))
print(id(num1[1]))
print(id(num2[1]))
- 结果分析
重新开辟一个num2的栈内存,并在堆内存中重新开辟一段内存指向num1指向的堆内存,将num2的栈内存指向新开辟的堆内存,即两组堆内存指向一样,并没有复制堆内存最终指向的数值。
3、深拷贝
import copy
num1=[10,[2,3]]
num2=copy.deepcopy(num1)
print(num1,id(num1))
print(num2,id(num2))
num1.append(4)
num1[0]=8
num1[1].append(100)
print(num1,id(num1))
print(num2,id(num2))
print(id(num1[1]))
print(id(num2[1]))
- 结果分析
堆内存中复制了嵌套的可变数据类型的元素
探究切片操作的类型
1、切片操作
num1=[1,2,3,[4,5]]
num2=num1[:]
num1[0]=0
num1.append(5)
num1[3].append(6)
print(num1)
print(num2)
print(num1[3],id(num1[3]))
print(num2[3],id(num2[3]))
2、 结果分析
由此可见,切片操作并没有复制可变类型的元素而是复制了可变类型的地址,相当于浅拷贝。