Python切片赋值操作

1. 问题

首先来看一小段和列表相关的python代码

a = [1,2,3]
# 赋值1
b = a
b[:] = [x+1 for x in a]
print(a,b)
# 赋值2
b = [x-1 for x in a]
print(a,b)

来看看输出吧:

[2, 3, 4] [2, 3, 4]
[2, 3, 4] [1, 2, 3]

可能有人会有疑问,为什么同样是复制操作,结果却不同?

2. step by step

其实我们有结果再推原因,应该大概可以知道可能b[:]和a是共享同一块内存的,实践是检验真理的唯一标准,让我们分别在赋值1和赋值2之后分别输出a,b的内存地址如下:

140348034061384 140348034061384
140348034061384 140348034060872

果不其然,第一次a,b都指向的是同一块内存,而赋值2则是在原来的地址上做修改,或者可以分别输出a is b来判断a,b是否为同一个对象

再将代码稍加改动:

a = [1,2,3]
# 改成a的切片
b = a[:]
print(a,b)
print(id(a),id(b))
b = [x-1 for x in a]
print(a,b)
print(id(a),id(b))

此时的输出为:

[1, 2, 3] [1, 2, 3]
140489909315016 140489909314312
[1, 2, 3] [0, 1, 2]
140489909315016 140489909314632

我们发现当使用a[:]时,这时候返回的是一个新的对象,所以其id都不相同

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值