Python切片赋值操作

1. 问题

首先来看一小段列表推到的python代码

a = [1,2,3]
b = a
# 赋值1
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 条评论
登录 后参与评论

相关文章

来自专栏决胜机器学习

PHP开发过程的那些坑(三) ——PHParray_shift函数

PHP开发过程的那些坑(三)——PHP array_shift函数 (原创内容,转载请注明来源,谢谢) 坑: 最近在自学数据结构,常常用PHP实现各种数据结构...

3158
来自专栏Python小屋

Python编程常见出错信息及原因分析(3)

(1)不可哈希错误 演示代码: >>> x = {[1], [2]} Traceback (most recent call last): File "<p...

4316
来自专栏有趣的django

7.python常用模块

time模块 常用表示时间方式: 时间戳,格式化的时间字符串,元组(struct_time) UTC(Coordinated Universal Time,世界...

36410
来自专栏Python

datetime

datetime是Python处理日期和时间的标准库。 获取当前日期和时间 我们先看如何获取当前日期和时间: >>> from datetime import ...

19510
来自专栏vue学习

45、MongoDB—增、删、改、查

我们这里新建一个user集合(表),然后插入一条id为1,name为Ewall的数据行。

582
来自专栏老马寒门IT

01Vue.js快速入门(一)Vue概念及Helloworld

Vue是一个前端的双向绑定类的框架,发音[读音 /vjuː/, 类似于 view]。新的Vue版本参考了React的部分设计,当然也有自己独特的地方,比如Vue...

2009
来自专栏PHP在线

深入浅析PHP7.0新特征(五大新特征)

截止到目前为止,PHP官方已经发布了php7的RC5版本,预计在11月份左右会发布第一个正式版本!现在来说php7的重大特性肯定已经是定型了,不会再有什么变动了...

28111
来自专栏pangguoming

web.xml中load-on-startup的作用

如下一段配置,熟悉DWR的再熟悉不过了: <servlet>    <servlet-name>dwr-invoker</servlet-name>    <s...

3357
来自专栏前端说吧

vue-细节小知识点汇总(更新中...)

884
来自专栏前端知识分享

第178天:表单验证

521

扫码关注云+社区