【问题标题】:Multiple slicing assignement with Python使用 Python 进行多重切片分配
【发布时间】:2021-07-18 07:26:21
【问题描述】:

我正在阅读一篇名为“复制列表中的每个成员”的帖子。我找到了解决这个我无法理解的问题的答案:

>>> 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[:]

【问题讨论】:

  • 我认为this 可能会解决您的疑问

标签: python-3.x slice


【解决方案1】:

这里的关键是理解序列是从左到右执行的,都是参考最右边的值。

最右边的切片 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

让我们讨论各个步骤

  1. b = a[:] 制作一个临时副本
  2. a[:0] = b 在前面插入 b,但实际上只是用于将 a 填充到两倍的长度,以便接下来的两个语句起作用
  3. a[::2] = b 在偶数索引处设置值(即从前面开始每隔一个索引)
  4. a[1::2] = b 将值设置为奇数索引(即除前面之外的每隔一个索引)

获得相同结果的另一种方法是以下元组赋值,它也先计算右侧,然后从左到右计算左侧:

(a[:0], a[::2], a[1::2]) = (a[:], a[:], a[:])

【讨论】:

    猜你喜欢
    • 2010-09-20
    • 2011-06-24
    • 2013-06-21
    • 1970-01-01
    • 2012-06-09
    • 2017-01-02
    • 2018-11-22
    • 2020-03-01
    相关资源
    最近更新 更多