如何使用切片赋值扩展此列表?

acd*_*cdr 12 python

我遇到了以下代码(有点):

my_list = [1, [2, 3, 4], 5]
my_list[1:2] = my_list[1]
Run Code Online (Sandbox Code Playgroud)

运行这两行后,变量my_list将是[1, 2, 3, 4, 5].对扩展嵌套列表非常有用.

但为什么它实际上做它做的事情呢?

我会假设该声明my_list[1:2] = my_list[1]将执行以下操作之一:

  • 简单地放入[2, 3, 4]列表中的第二个位置(它已经存在)
  • 从尝试将三个值(即2,3,4)放入仅长度为1(即my_list[1:2])的容器中,给出某种"解压缩的值太多"错误.(使用Numpy数组而不是列表重复上述操作会导致类似的错误.)

其他问题(例如,赋值如何与python列表切片一起使用)往往不太注意要替换的切片大小与要替换它的项目的大小之间的差异.(更别说解释它为什么会这样运作了.)

nnn*_*mmm 5

切片赋值使用右侧的iterable替换列表的指定部分,其可能具有与切片不同的长度.从表面上看问题,之所以如此,是因为它很方便.

您并没有真正分配切片,即Python不会生成包含列表中指定值的切片对象,然后更改这些值.一个不起作用的原因是切片返回一个新列表,因此该操作不会更改原始列表.

另请参阅此问题,该问题强调切片和切片分配完全不同.