提问人:Kartik Anand 提问时间:5/17/2012 最后编辑:martineauKartik Anand 更新时间:8/19/2023 访问量:75918
作业如何使用列表切片?
How does assignment work with list slices?
问:
Python 文档说,对列表进行切片会返回一个新列表。
现在,如果返回一个“新”列表,我有以下与“切片分配”相关的问题
a = [1, 2, 3]
a[0:2] = [4, 5]
print a
现在输出为:
[4, 5, 3]
- 返回某物的东西怎么会出现在表达的左侧?
- 是的,我阅读了文档,它说这是可能的,现在既然切片列表会返回一个“新”列表,为什么会修改原始列表?我无法理解它背后的机制。
答:
通过在分配操作的左侧进行切片,可以指定要分配到哪些物料。
您混淆了两个使用非常相似语法的不同操作:
1)切片:
b = a[0:2]
这将复制 的切片并将其分配给 。a
b
2)切片分配:
a[0:2] = b
这会将 的切片替换为 的内容。a
b
尽管语法相似(我想是设计使然!),但这是两个不同的操作。
评论
当您在运算符的左侧指定时,您使用的是 Python 的正常赋值,该赋值会更改当前上下文中的名称以指向新值。这不会更改所指向的先前值。a
=
a
a
通过在运算符的左侧指定,您告诉 Python 您要使用切片赋值。切片分配是列表的一种特殊语法,您可以在其中插入、删除或替换列表中的内容:a[0:2]
=
插入:
>>> 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]
但是,元组解包仅限于替换,因为您无法插入或删除元素。
在所有这些操作之前和之后,是相同的确切列表。Python 只是提供了很好的语法糖来就地修改列表。a
评论
a[:] = some_list
a = some_list[:]
a = some_list
a[:] = some_list
a
some_list
a
a = [1, 2, 3]
b = a
a[:] = [4, 5, 6]
a is b
a
start: stop: step
我之前遇到过同样的问题,它与语言规范有关。根据分配声明,
如果赋值的左侧是 subscription,则 Python 将对该对象调用
__setitem__
。 等效于 。a[i] = x
a.__setitem__(i, x)
如果赋值的左侧是 slice,Python 也会调用 ,但参数不同: 等价于
__setitem__
a[1:4]=[1,2,3]
a.__setitem__(slice(1,4,None), [1,2,3])
这就是为什么“=”左侧的列表切片的行为不同。
当你这样做时,你为(切片)的左侧分配了 , 的右侧的值。a[0:2] = [4,5]
=
a[0:2]
=
[4,5]
评论
=