python list内存_在Python中,如何在内存方面理解list和list[:]?

简单来说:python在做切片的时候是通过申请一个新的内存去构造一个新的列表来存储切片得到的的值。

原理:Python原始数据结构中并没有列表的“视图”概念,因为列表自己的内存地址上存储的就是值的索引了。无论切片还是浅拷贝,都是开辟新的内存空间,将这些原列表切片段地址保存的索引复制到新的内存地址上,并将新的内存地址生成新的list对象返回给你

说明:

a[?:?]的形式进行切片,无论?具体为多少,它都会逐个访问这些值,并申请新的内存空间构造新的list对象来存储上述的值。所以,当你对切片后的对象取id是肯定不同的。

但是id(a[?])的形式却是返回a列表第?个索引指向的内存地址,即第?个值的真实存储地址。在此情况下,b = a[:],id(b[0]) 是等于 id(a[0])的。

例子:

>>> a = [1, 2, 3]

>>> b, c, d = a[0:], a[1:], a[2:]

>>> id(b), id(c), id(d)

(340416392L, 346237960L, 346471688L)

>>>

>>> b = a[:]

>>> id(a[0]), id(a[1]), id(a[2])

(55075864L, 55075840L, 55075816L)

>>> id(b[0]), id(b[1]), id(b[2])

(55075864L, 55075840L, 55075816L)

附:至于题主的倒数第二个案例为啥他们id会一样的原因,我觉得有可能是bug…

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值