赋值如何与python list slice一起使用

时间:2012-05-16 17:05:14

标签: python

Python doc说切片列表会返回一个新列表。 现在,如果返回“新”列表,我有以下与“分配给切片”

相关的疑问
a = [1, 2, 3]
a[0:2] = [4, 5]
print a

现在输出为:

[4, 5, 3] 
  1. 表达方式的左侧是如何回归的东西。
  2. 是的,我阅读了文档并且它说有可能,因为切片列表返回一个“新”列表,为什么原始列表被修改,我无法理解它背后的机制。

4 个答案:

答案 0 :(得分:87)

您使用非常相似的语法会混淆两个不同的操作:

1)切片:

b = a[0:2]

这会复制a切片,并将其分配给b

2)切片分配:

a[0:2] = b

使用a的内容替换<{1}}的切片

虽然语法类似(我想象设计!),但这是两种不同的操作。

答案 1 :(得分:48)

当您在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]

注意:

  

切片的长度可以与切片的长度不同   分配序列,从而改变目标序列的长度,如果   目标序列允许它。 - source

切片分配提供与Tuple Unpacking类似的功能。例如,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]

但是,元组解包仅限于替换,因为您无法插入或删除元素。

在所有这些操作之前和之后,a是完全相同的列表。 Python只是提供了很好的语法糖来就地修改列表。

答案 2 :(得分:17)

之前我遇到过同样的问题,它与语言规范有关。根据{{​​3}},

  1. 如果赋值的左侧是订阅,Python将在该对象上调用assignment-statementsa[i] = x相当于a.__setitem__(i, x)

  2. 如果赋值的左侧是切片,Python也会调用__setitem__,但使用不同的参数: a[1:4]=[1,2,3]相当于 a.__setitem__(slice(1,4,None), [1,2,3])

  3. 这就是为什么“=”左侧的列表切片表现不同的原因。

答案 3 :(得分:3)

通过在赋值操作的左侧进行切片,您可以指定要分配的项目。