列表切片如何进行赋值操作?
- 2024-11-27 10:42:00
- admin 原创
- 108
问题描述:
Python 文档说,切片列表会返回一个新列表。
现在,如果返回的是“新”列表,我有以下与“切片赋值”相关的问题
a = [1, 2, 3]
a[0:2] = [4, 5]
print a
现在输出将是:
[4, 5, 3]
返回某物的东西怎么能出现在表达式的左边呢?
是的,我读了文档,上面说这是可能的,现在既然切片列表会返回一个“新”列表,为什么原始列表会被修改?我无法理解其背后的机制。
解决方案 1:
您混淆了两个使用非常相似语法的不同操作:
1)切片:
b = a[0:2]
这将复制 的切片a
并将其分配给b
。
2)切片赋值:
a[0:2] = b
这将用 的内容替换的切片。a
`b`
尽管语法相似(我想象是设计的!),但这是两种不同的操作。
解决方案 2:
a
当您在运算符左侧指定时=
,您正在使用 Python 的常规赋值,它会将当前上下文中的名称更改a
为指向新值。这不会更改a
指向的先前值。
a[0:2]
通过在运算符的左侧指定=
,你告诉 Python 你想要使用切片赋值。切片赋值是列表的一种特殊语法,你可以在其中插入、删除或替换列表中的内容:
插入:
>>> a = [1, 2, 3]
>>> a[0:0] = [-3, -2, -1, 0]
>>> a
[-3, -2, -1, 0, 1, 2, 3]
删除:
>>> a
[-3, -2, -1, 0, 1, 2, 3]
>>> a[2:4] = []
>>> a
[-3, -2, 1, 2, 3]
替代品:
>>> a
[-3, -2, 1, 2, 3]
>>> a[:] = [1, 2, 3]
>>> a
[1, 2, 3]
笔记:
切片的长度可能与分配的序列的长度不同,从而改变目标序列的长度(如果目标序列允许的话)。 -来源
切片赋值提供了和元组解包类似的功能。例如,a[0:1] = [4, 5]
相当于:
# Tuple Unpacking
a[0], a[1] = [4, 5]
通过元组解包,你可以修改非连续列表:
>>> a
[4, 5, 3]
>>> a[-1], a[0] = [7, 3]
>>> a
[3, 5, 7]
但是,元组解包仅限于替换,因为您不能插入或删除元素。
所有这些操作前后a
都是相同的列表。Python 只是提供了很好的语法糖来就地修改列表。
解决方案 3:
我以前遇到过同样的问题,它与语言规范有关。根据赋值语句,
如果赋值语句的左边是订阅,那么Python 就会调用
__setitem__
该对象。a[i] = x
相当于a.__setitem__(i, x)
。如果赋值语句的左边是切片,Python 也会调用
__setitem__
,但参数不同:a[1:4]=[1,2,3]
相当于
a.__setitem__(slice(1,4,None), [1,2,3])
这就是为什么“=”左侧的列表切片表现不同的原因。
解决方案 4:
通过对赋值操作的左侧进行切片,您可以指定要分配的项目。
解决方案 5:
当你这样做时,你将(切片)a[0:2] = [4,5]
左侧的值分配给 右侧的值。 =
`a[0:2]=
[4,5]`
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)