溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Golang字符串切片與Python 列表與申請表

發(fā)布時間:2021-06-15 11:12:02 來源:億速云 閱讀:211 作者:Leah 欄目:web開發(fā)

本篇文章為大家展示了Golang字符串切片與Python 列表與申請表,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

這兩個數(shù)據(jù)結(jié)構(gòu)從形式上來說,非常相似。我們今天來對比一個只包含字符串的列表和一個字符串切片。

相同點

在 Python 里面,我們定義一個有初始值的字符串列表:

a = ['kingname', 'pm', 'xxx']

在 Golang 里面,我們定義一個有初始值的字符串切片:

a := []string{"kingname", "pm", "xxx"}

接下來,我們分別往字符串列表和字符串切片末尾增加幾個元素:

a.append("address") a.append("shanghai")

在 Golang 里面:

a = append(a, "address") a = append(a, "shanghai")

我們也可以賦值給其他的變量,看看修改一個,另一個是否會發(fā)生修改:

b = a a[0] = 'superman' print(b)

運行效果如下圖所示:

Golang字符串切片與Python 列表與申請表

我們再來看看在 Golang 的效果:

b := a a[0] = "superman" fmt.Println(b)

運行效果如下圖所示:

Golang字符串切片與Python 列表與申請表

那么,我們是不是可以說,Golang 的切片就相當(dāng)于 Python 里面元素數(shù)據(jù)類型相同的列表?

不同點

現(xiàn)在,我們再往列表和字符串切片里面各加一個元素,來看看運行效果:

在 Python 里面,運行效果如下圖所示:

Golang字符串切片與Python 列表與申請表

進一步實驗?zāi)銜l(fā)現(xiàn),a 和 b 兩個列表是完全一樣的,只要修改任何一個列表,另一個都會隨之發(fā)生變化。

但是 Golang 里面并不是這樣,如下圖所示:

Golang字符串切片與Python 列表與申請表

你修改任何一個切片,另一個切片都不會改變。

看到這里,你可能會覺得 Golang 里面,是不是append添加新的數(shù)據(jù),每次都會生成新的切片,所以才導(dǎo)致添加數(shù)據(jù)以后兩個切片就不一樣了。

但實際上并不是這樣,我們用另外一種初始化切片的方式來做一個測試:

Golang字符串切片與Python 列表與申請表

在這個例子里面,我生成了一個長度為5,容量為20的字符串切片。根據(jù)第15-19行的運行結(jié)果可以看到,此時,無論是根據(jù)索引修改里面的元素,還是使用  append 添加新的元素,兩個切片的變化都相同。如果我們把切片的容量調(diào)小,調(diào)整到6,再看看效果:

Golang字符串切片與Python 列表與申請表

從這里可以看到,b 跟著 a 變了半截。a 新增的test字符串同時也能在 b 里面找到。但是 a里面新增的abcde卻沒有出現(xiàn)在 b  中。并且對a[0]的修改,也沒有出現(xiàn)在 b 中。

原因

Golang 的切片之所以會出現(xiàn)這個現(xiàn)象,這需要從數(shù)組與切片的區(qū)別來說起。在 Golang  里面,字符串?dāng)?shù)組和字符串切片非常像,但他們有一個根本的區(qū)別,就是數(shù)組是需要一開始就聲明長度的,并且不能擴容。而切片不需要聲明長度,所以:

[5]string{"xx", "yy"}  // 這是長度為5的字符串?dāng)?shù)組 []string{"xx", "yy"} // 字符串切片

而切片底層依然是數(shù)組,切片有一個容量的概念,指的就是它底層的數(shù)組的長度。如果切片中的數(shù)據(jù)數(shù)量等于了切片的容量,那么下一次再添加一個新的數(shù)據(jù)的時候,切片底層就會創(chuàng)建一個原來長度2倍(數(shù)據(jù)量小于1024的時候是2倍,大于1024的時候是1.25倍)的數(shù)組,然后把已有數(shù)據(jù)按順序拷貝進去,接著再插入新的數(shù)據(jù)。

所以,回到上面的代碼。當(dāng)我們使用a := make([]string, 5,  6)創(chuàng)建一個容量為6的字符串切片的時候,它底層會初始化一個長度為6的字符串?dāng)?shù)組。當(dāng)代碼執(zhí)行到b := a[0: 6]的時候,雖然這里的 b 是另外一個切片,它跟  a  擁有不同的內(nèi)存地址,但他們共用了同一個底層數(shù)組。只要數(shù)據(jù)小于6,那么對其中一個切片的數(shù)據(jù)進行修改,本質(zhì)上就是對它底層數(shù)組的修改,而另一個切片也使用這個數(shù)組,所以也能看到這個修改。

但是當(dāng)a數(shù)據(jù)容量超過6以后,a  切片底層會重新生成一個長度為12的數(shù)組,并把原有的老數(shù)據(jù)都拷貝到新的數(shù)組里面,接下來的所有修改都是對這個新的數(shù)組進行修改。而此時 b  切片底層還是老的長度為6的數(shù)組,所以此時對 a 切片的修改就不會反映到 b 上面了。

上述內(nèi)容就是Golang字符串切片與Python 列表與申請表,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI