Python 的多重切片赋值
Multiple slicing assignement with Python
我正在阅读一篇名为“复制列表中的每个成员”的 post。我找到了解决这个我无法理解的问题的答案:
>>> a = [3, 1, 4, 1, 5]
>>> a[:0] = a[::2] = a[1::2] = a[:]
>>> a
[3, 3, 1, 1, 4, 4, 1, 1, 5, 5]
你能一步一步地解释一下下面这行程序是如何工作的吗:
>>> a[:0] = a[::2] = a[1::2] = a[:]
这里的关键是理解序列 是从左到右执行的,所有都参考最右边的值。
最右边的切片 a[:]
被分配给最左边的 3 个切片中的每一个。请注意使用 a[:]
而不是 a
,这确保我们在开头制作 一个副本 并且我们对 a
的操作不会改变这一点价值。一种更清晰的写法是存储副本 a[:]
:
>>> a = [3, 1, 4, 1, 5]
>>> b = a[:]
>>> b
[3, 1, 4, 1, 5]
>>> a[:0] = b
>>> a
[3, 1, 4, 1, 5, 3, 1, 4, 1, 5]
#^^^^^^^^^^^^^ changed
>>> a[::2] = b
>>> a
[3, 1, 1, 1, 4, 3, 1, 4, 5, 5]
#^ ^ ^ ^ ^ changed
>>> a[1::2] = b
>>> a
[3, 3, 1, 1, 4, 4, 1, 1, 5, 5]
# ^ ^ ^ ^ ^ changed
让我们讨论一下各个步骤
b = a[:]
制作 a 的临时副本
a[:0] = b
在前面插入 b
,但实际上只是用来填充 a 到两倍的长度,以便接下来的两个语句起作用
a[::2] = b
设置偶数索引的值(即从前面开始的每隔一个索引)
a[1::2] = b
设置奇数索引处的值(即每隔一个索引,不包括前面)
获得相同结果的另一种方法是下面的元组赋值,它也首先计算右侧,然后从左到右计算左侧:
(a[:0], a[::2], a[1::2]) = (a[:], a[:], a[:])
我正在阅读一篇名为“复制列表中的每个成员”的 post。我找到了解决这个我无法理解的问题的答案:
>>> a = [3, 1, 4, 1, 5]
>>> a[:0] = a[::2] = a[1::2] = a[:]
>>> a
[3, 3, 1, 1, 4, 4, 1, 1, 5, 5]
你能一步一步地解释一下下面这行程序是如何工作的吗:
>>> a[:0] = a[::2] = a[1::2] = a[:]
这里的关键是理解序列 是从左到右执行的,所有都参考最右边的值。
最右边的切片 a[:]
被分配给最左边的 3 个切片中的每一个。请注意使用 a[:]
而不是 a
,这确保我们在开头制作 一个副本 并且我们对 a
的操作不会改变这一点价值。一种更清晰的写法是存储副本 a[:]
:
>>> a = [3, 1, 4, 1, 5]
>>> b = a[:]
>>> b
[3, 1, 4, 1, 5]
>>> a[:0] = b
>>> a
[3, 1, 4, 1, 5, 3, 1, 4, 1, 5]
#^^^^^^^^^^^^^ changed
>>> a[::2] = b
>>> a
[3, 1, 1, 1, 4, 3, 1, 4, 5, 5]
#^ ^ ^ ^ ^ changed
>>> a[1::2] = b
>>> a
[3, 3, 1, 1, 4, 4, 1, 1, 5, 5]
# ^ ^ ^ ^ ^ changed
让我们讨论一下各个步骤
b = a[:]
制作 a 的临时副本
a[:0] = b
在前面插入b
,但实际上只是用来填充 a 到两倍的长度,以便接下来的两个语句起作用a[::2] = b
设置偶数索引的值(即从前面开始的每隔一个索引)a[1::2] = b
设置奇数索引处的值(即每隔一个索引,不包括前面)
获得相同结果的另一种方法是下面的元组赋值,它也首先计算右侧,然后从左到右计算左侧:
(a[:0], a[::2], a[1::2]) = (a[:], a[:], a[:])