python的切片操作是深拷贝还是浅拷贝?

目录

 

探究问题

知识扫盲

1、直接赋值

2、浅拷贝

3、深拷贝

探究切片操作的类型

1、切片操作

2、 结果分析


 

探究问题

探究python的切片操作属于深拷贝还是浅拷贝

 

知识扫盲

1、直接赋值

num1 = [1, 2, 3]
num2 = num1
num1.append(4)
print(num2)

 

  • 结果分析

798d366c4b29484ba188e4df9507f171.png

 直接将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]))
  • 结果分析

993b99b4f61446748e406f37bbaf868e.png

重新开辟一个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]))
  • 结果分析

0ceb18f24df7451a9cd9143b6b6ac487.png

堆内存中复制了嵌套的可变数据类型的元素
 

探究切片操作的类型

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、 结果分析

676be84e660b4e14936a7c0e2287ec3f.png

由此可见,切片操作并没有复制可变类型的元素而是复制了可变类型的地址,相当于浅拷贝。

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

coleak

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值