go和python切片的不同

go有切片slice類型,python有列表和元組,這兩種語言都有切片操作。
但是它們的切片操作是完全不同的。
首先說第一個,go的切片,其成員是相同類型的,python的列表和元組則不限制類型。
兩種語言都有[a:b]這種切片操作,意義也類似,但是go的a、b兩個參數不能是負數,python可以是負數,此時就相當於從末尾往前數。
兩種語言都有[a:b:c]這種切片操作,意義卻是完全不同的。go的c,表示的是容量;而python的c表示的是步長

但是最大的不同,還是:

python的切片產生的是新的對象,對新對象的成員的操作不影響舊對象;
go的切片產生的是舊對象一部分的引用,對其成員的操作會影響舊對象。

究其原因,還是底層實現的不同。

go的切片,底層是一個三元組,一個指針,一個長度,一個容量。指針指向一塊連續的內存,長度是已有成員數,容量是最大成員數。切片時,一般並不會申請新的內存,而是對原指針進行移動,然後和新的長度、容量組成一個切片類型值返回。也就是說,go的切片操作通常會和生成該切片的切片共用內存。
不僅是切片,字符串、數組的切片也是一樣的,通常會共用內存。
當然也有異常情況,那就是切片時,提供的容量過大,此時會申請新內存並拷貝;或者對切片append超出容量,也會如此。這時,新的切片,纔不會和老切片共享內存。(如果你切片/創建時提供的容量小於長度,會panic)
python的列表,其實是個指針數組。當然在下層也會提供一些空位之類的,但基本就是個數組。對它們切片,會創建新的數組,注意,是創建新的數組!python的列表可沒有容量的概念。
這其實也體現了腳本語言和編譯語言的不同。雖然兩個語言都有類似的切片操作;但是python主要目標是方便;go主要目標卻是快速(並彌補丟棄指針運算的缺陷)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章