簡體   English   中英

使用 Python 進行多重切片分配

[英]Multiple slicing assignement with Python

我正在閱讀一篇名為“復制列表中的每個成員”的帖子。 我找到了解決這個我無法理解的問題的答案:

>>> 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

讓我們討論各個步驟

  1. b = a[:]制作 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[:])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM