【问题标题】:Slice-based assignment vs index-based assignment [duplicate]基于切片的分配与基于索引的分配[重复]
【发布时间】:2019-11-10 19:34:52
【问题描述】:
# Attempt1 using direct index-based assignment
p=[1,2,3,4]
p[1]=p[2]=[]
print(p) # [1, [], [], 4] 
// that sounds reasonable..


# Attempt2 using slice-based assignment
p=[1,2,3,4]
print(p[1:3]) # [2, 3]
p[1:3]=[] 
print(p) # [1, 4] !!

在阅读here 的答案后,我的理解是,p[1:3] 应该是一个引用序列,应该在其上分配给空列表。但它似乎从列表中删除了元素! 就好像,我这样做了:

p=[1,2,3,4]
print(p) # [1, 2, 3, 4]
del p[1:3]
print(p) # [1, 4]

你能解释一下吗?

【问题讨论】:

  • 您将一个切片分配给列表的某个切片。例如,您可以分配一个包含更多元素的列表来扩展列表。本质上归结为这样一个事实:修改后的列表是oldlist[:begin] + value + oldlist[end:]beginend 分别是切片的开始和结束部分。

标签: python python-3.x list slice


【解决方案1】:

当您分配切片时,它会在两个列表之间执行逐个元素的分配。所以如果你这样做:

list1[1:3] = [1, 2]

大致相当于:

list1[1] = 1
list1[2] = 2

但只有当切片与源列表长度相同时才会出现这种情况。

如果源列表较短,它会删除目标切片中的所有额外元素。如果源列表较长,它会在切片的末尾插入额外的元素。

所以如果源列表是空的,就像你的代码一样,切片的所有元素都是“额外的”,所以切片从列表中删除。

【讨论】:

  • 如果您对此行为有 doc 的参考,您可以添加它吗?
  • 我刚刚找到的重复问题中有一个链接。
猜你喜欢
  • 2018-04-09
  • 1970-01-01
  • 2021-12-17
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-28
  • 1970-01-01
  • 2020-08-14
相关资源
最近更新 更多