2014-10-03 164 views
7

我见过的人都说只是通过附加旧如何从切片中删除最后一个元素?

*slc = append(*slc[:item], *slc[item+1:]...) 

,但如果你想删除的最后一个元素切片什么创建一个新的片?

如果您尝试用i+1替换i(最后一个元素),由于没有i+1,它将返回一个超出界限的错误。

回答

12

您可以使用len()找到使用索引的最后一个元素前的长度和重排:

if len(slice) > 0 { 
    slice = slice[:len(slice)-1] 
} 

Click here to see it in the playground

+0

如果'len(slice)== 0'会失败:'panic:runtime error:slice bounds out of range'。 – peterSO 2014-10-03 01:56:51

+0

...好的,是的。这不是问题的一部分..但我会更新我的答案以帮助解决这个问题。 – 2014-10-03 01:57:36

+2

另外,no:=,slice已经定义。 :) – LinearZoetrope 2014-10-03 02:00:50

0

TL; DR:

myslice = myslice[:len(myslice) - 1] 

顺便说一句,这将如果“myslice”为零,则失败。

较长的答案:

myslice = myslice[:len(myslice) - 1] 

如果 “myslice” 是零大小这将失败。

切片是指向底层数组的数据结构,切片切片等操作使用相同的底层数组。

这意味着如果您切片,则新切片仍将指向与原切片相同的数据。

通过以上操作,最后一个元素仍然在数组中,但您将无法再引用它。

编辑

澄清: 如果您在重新分区分片到原来的长度,你就可以参考上一对象

/编辑

如果你有一个非常大片,你也想修剪底层数组来节省内存,你可能想用“复制”来创建一个更小的底层数组的新片,并让旧的大片得到垃圾回收。

+0

@tommywild:增加了关于引用最后一个元素的说明。我明白,这是一种含蓄的解释,说明你在“去除”元素时正在做什么。 的确,你也可以使用append。 如果此更改满足您,您是否可以删除-1? 老实说,我不认为它的前途是值得-1:/ – DallaRosa 2014-10-03 02:26:15

+0

@tommywild确定:)无论如何,你的观点是有效的,谢谢指出:) – DallaRosa 2014-10-03 02:29:26

+1

不知道为什么-1 ..所以有另一个upvote。事实上,你的答案比我的更全面。 – 2014-10-03 02:37:55

相关问题