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 条评论
登录 后参与评论

相关文章

来自专栏Coding迪斯尼

reactjs自制Monkey语言编译器:解析组合表达式,ifelse语句块和间套函数调用

403
来自专栏iOS技术杂谈

iOS runtime探究(五): 从runtime开始深入weak实现机理你要知道的runtime都在这里

你要知道的runtime都在这里 转载请注明出处 https://cloud.tencent.com/developer/user/1605429 本文主要讲解...

2756
来自专栏Java爬坑系列

【JAVA零基础入门系列】Day4 变量与常量

  这一篇主要讲解Java中的变量,什么是变量,变量的作用以及如何声明,使用变量。   那么什么是变量?对于初学者而言,可以将变量理解为盒子,这些盒子可以用来存...

18610
来自专栏老九学堂

1分钟彻底理解C语言指针的概念

计算机中所有的数据都必须放在内存中,不同类型的数据占用的字节数不一样,例如 int 占用4个字节,char 占用1个字节。为了正确地访问这些数据,必须为每个字节...

3528
来自专栏King_3的技术专栏

leetcode-371-Sum of Two Integers

2096
来自专栏点滴积累

Python扩展方法一二事

前言 跟着一个有强迫症的老板干活是一件极其幸福的事情(你懂的)。最近碰到一个问题,简单的说就是对一个对象做出部分修改后仍然返回此对象,于是我就写了一个方法,老板...

3326
来自专栏偏前端工程师的驿站

Javascript Prototypes之旅(A Plain English Guide to JavaScript Prototypes译文)

  当我第一次学习Javascript的对象模型时,我的反应时困惑。因为这是我第一次接触基于原型的语言,所以我完完全全被原型弄得糊里糊涂(译者语:在看这篇文章前...

1739
来自专栏菜鸟前端工程师

JavaScript学习笔记023-对象方法0包装对象0静态属性

602
来自专栏C语言及其他语言

C语言自定义函数如何返回数组(上)?

最近看到一些同学问题,有提到说:如何在一个函数中返回数组呢? 能否直接在自定义 函数中,写成char *类型返回值,直接返回呢?,代码如下: ? 直接返回str...

2744
来自专栏编程

Python读书笔记8

今天和大家分享的是列表的相关函数。 其实今天分享的函数对于字符串、列表、元组都可以使用,已经会的当做复习咯。 至于神马是元组,后续会分享哦! 一、In Or N...

1737

扫码关注云+社区