python中的切片赋值

直接赋值

a = b a=b a=b意味着创建一个 b 的引用。这意味着 a a a b b b 都指向内存中的同一个数组对象,因此对 a a a 的任何修改都会反映在 b b b 上,反之亦然。

b = [1,2,3,4,5]
a = b
print(id(a)==id(b))
a[2] = 9
print(f'a={a},b={b}')

###返回值
True
a=[1, 2, 9, 4, 5],b=[1, 2, 9, 4, 5]

切片赋值

使用 $c = b[:] $这样的语法时,你实际上是在创建 $b $的一个浅拷贝。这里的 $[:] $是切片操作,它创建了一个新的数组对象 c c c,该对象包含与 b 相同的元素。
但 c 和 b 是两个独立的对象,它们在内存中的地址不同,因此对 c 的修改不会影响到 b,反之亦然。

c = b[:]
print(id(c)==id(b))
c[2] = 9
print(f'c={c},b={b}')
###返回值
False
c=[1, 2, 9, 4, 5],b=[1, 2, 9, 4, 5]

深拷贝与浅拷贝

浅拷贝(如 b[:])只复制了最外层的容器,如果数组中还包含了其他容器,如列表、字典等,这些内部容器不会被复制,内部容器的引用仍然指向原始对象。
深拷贝(可以通过 copy 模块的 deepcopy 函数实现)会复制容器内的所有元素,包括内部容器及其内容,创建完全独立的对象。

d = [[1,2,3],(2,3,4),9]
e = d[:] #浅拷贝,最外层拷贝
e[2] = 1
print(id(d)==id(e))
print(f'e={e},d={d}')
print(id(e[2])==id(d[2]))
print(id(e[1])==id(d[1]))# 内层容器指向不变

### 返回值
False
e=[[1, 2, 3], (2, 3, 4), 1],d=[[1, 2, 3], (2, 3, 4), 9]
False
True

结论

当你需要创建数组的独立副本时,应该使用切片操作或者 copy 模块的方法来避免直接引用原始数组。这样可以保证原始数组和新数组的操作互不影响,避免在程序中产生意外的副作用。

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值