如何赋值与Python列表切片
Python文档说切片列表返回一个新的列表。 现在,如果一个“新”列表正在返回,我有以下怀疑涉及“分配到切片”
a = [1, 2, 3] a[0:2] = [4, 5] print a
现在输出将是:
[4, 5, 3]
- 表情的左边怎么回事呢?
- 是的,我读了文档,它说这是可能的,因为切片清单返回一个“新”列表,为什么原始列表被修改,我无法理解它背后的机制。
您混淆了使用非常相似的语法的两个不同的操作:
1)切片:
b = a[0:2]
这将创build一个a片的副本并将其分配给b
。
2)切片分配:
a[0:2] = b
这用 a
的内容replace a
的b
。
虽然语法是相似的(我想象的是devise!),但这是两种不同的操作。
当你在=
运算符的左侧指定a
时,你正在使用python的正常赋值 ,它改变当前上下文中的名字a
来指向新的值。 这不会更改指向的以前的值。
通过在=
运算符的左边指定a[0:2]
,你告诉python你想使用Slice Assignment 。 切片分配是列表的特殊语法,您可以在其中插入,删除或replace列表中的内容:
插入 :
>>> 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]
replace :
>>> a [-3, -2, 1, 2, 3] >>> a[:] = [1, 2, 3] >>> a [1, 2, 3]
Slice Assignment提供了与Tuple Unpacking类似的function。 例如, a[0:1] = [4, 5]
等价于:
# Tuple Unpacking a[0], a[1] = [4, 5]
使用Tuple Unpacking,您可以修改非顺序列表:
>>> a [4, 5, 3] >>> a[-1], a[0] = [7, 3] >>> a [3, 5, 7]
但是,元组解包仅限于replace,因为您不能插入或删除元素。
所有这些操作之前和之后, a
是一样的确切列表。 Python只是提供了很好的语法糖来就地修改列表。
我之前遇到过同样的问题,它与语言规范有关。 根据赋值语句 ,
(1)如果赋值的左边是订阅,python将调用该对象的__setitem__ 。 a[i] = x
相当于a.__setitem__(i, x)
。
(2)如果赋值的左边是slice,python也会调用__setitem__,但是使用不同的参数: a[1:4]=[1,2,3]
相当于a.__setitem__(slice(1,4,None), [1,2,3])
这就是为什么'='左侧的列表切片行为不同。
通过在分配操作的左侧切片,您可以指定要分配的项目。