2014-10-03 165 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

相關問題