亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Go 變量被覆蓋(錯誤?)

Go 變量被覆蓋(錯誤?)

Go
慕婉清6462132 2021-07-02 14:00:44
這里有點奇怪。我的問題是,人們運行我的代碼會得到和我一樣的結果嗎?如果你這樣做了,是我的代碼有問題(我通常是一個 python 程序員),還是 golang 中的錯誤?系統信息:圍棋版本(1.1.2)的Linux的x64(Fedora的19)代碼的背景信息:我正在做的是找到從三角形頂部到底部的最高成本路線,這是來自 project_euler 18 和 67該bug:我設置了一個名為pathA變量,這是一個整數列表,加上新價值新的int從三角形如3,7,2追加8中應該等于3,2,7,8,但它確實!......直到我設置pathB。pathB被設置正確但是突然pathA是相同的值pathB。tl;dr當我設置另一個變量時,一個變量被覆蓋我的代碼如下:package mainimport (    "fmt")func extendPaths(triangle, prePaths [][]int) [][]int {    nextLine := triangle[len(prePaths)]    fmt.Println("#####PrePaths: ", prePaths)    fmt.Println("#####nextLine: ", nextLine)    postPaths := [][]int{{}}    for i := 0; i < len(prePaths); i++ {        route := prePaths[i]        nextA := nextLine[i]        nextB := nextLine[i+1]        fmt.Println("Next A:", nextA, "Next B:", nextB, "\n")        pathA := append(route, nextA)        fmt.Println("pathA check#1:", pathA)        pathB := append(route, nextB)        fmt.Println("pathA check#2:", pathA, "\n")        postPaths = append(postPaths, pathA)        postPaths = append(postPaths, pathB)    }    postPaths = postPaths[1:]    prePaths = [][]int{postPaths[0]}    for i := 1; i < len(postPaths)-1; i += 2 {        if getSum(postPaths[i]) > getSum(postPaths[i+1]) {            prePaths = append(prePaths, postPaths[i])        } else {            prePaths = append(prePaths, postPaths[i+1])        }    }    prePaths = append(prePaths, postPaths[len(postPaths)-1])    return prePaths}func getSum(sumList []int) int {    total := 0    for i := 0; i < len(sumList); i++ {        total += sumList[i]    }    return total}func getPaths(triangle [][]int) {    prePaths := [][]int{{triangle[0][0]}}    for i := 0; i < len(triangle)-1; i++ {        prePaths = extendPaths(triangle, prePaths)    }}func main() {    triangle := [][]int{{3}, {7, 4}, {2, 4, 6}, {8, 5, 9, 3}}    getPaths(triangle)}
查看完整描述

1 回答

?
萬千封印

TA貢獻1891條經驗 獲得超3個贊

切片基本上是由 3 件事組成的結構:

  1. 指向切片中元素數組的指針

  2. 該數組的長度(“容量”)

  3. 數組中實際存儲的元素數(“長度”)

當您運行以下代碼時:

append(x, element)

它執行以下操作:

  1. 檢查擴展切片是否會超出底層數組的容量。如果是這樣,分配一個更大的并將現有元素復制到新數組,并更新容量。

  2. 將新元素(或多個元素)寫入數組的末尾并更新長度。

  3. 返回新切片。

在您的代碼中,您有以下內容:

pathA := append(route, nextA)
pathB := append(route, nextB)

現在這里有兩種可能:

  1. len(route) == cap(route),并且將分配一個新的支持數組,pathApathB具有獨立的值。

  2. len(route) < cap(route),所以pathApathB最終共享相同的背襯陣列。數組中的最后一個元素將是nextB,因為該操作是第二次運行的。

對于循環的前幾次迭代,第一種情況似乎是正確的,之后您遇到了第二種情況。您可以通過手動為其中一個路徑制作副本來避免這種情況(使用 分配一個切片make(),然后用于copy()復制舊數據)。


查看完整回答
反對 回復 2021-07-12
  • 1 回答
  • 0 關注
  • 253 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號