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

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

為什么我的追加函數會將切片的每個成員更改為要添加的新項目?

為什么我的追加函數會將切片的每個成員更改為要添加的新項目?

Go
小怪獸愛吃肉 2023-06-19 11:10:54
我正在制作一個簡單的質因數函數,它可以放置一個[][]int類似于prime_factors_mult(315) => [[3,2],[5,1],[7,1]]但是我得到的結果不是這個結果,而是[[7,1][7,1][7,1][7,1]]后來減少到一個空的切片,因為它們會重復自己。我試著一步一步地看它,它會將所有值更改為最后一個追加。我應該怎么做才能避免這種情況?func prime_factors_mult(x []int)(y [][]int){// Problem 36    in :=[]int{0,0}    var k [][]int    for _,item := range x{        tok := 0        for i:=0;i<len(x);i++{            if item == x[i]{                tok++            }        }        in[0]=item        in[1]=tok        k=append(k,in)    }    for _,item := range k{        for i:=0;i<len(k);i++{            if item[0] != k[i][0]{                y = append(y,item)            }        }    }    return}
查看完整描述

2 回答

?
有只小跳蛙

TA貢獻1824條經驗 獲得超8個贊

您創建切片一次,然后每次都對其進行修改,因此每次都in添加完全相同的對象。k

改為附加一個切片:

k=append(k,[]int{item, tok})


查看完整回答
反對 回復 2023-06-19
?
呼如林

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

Range 的語法每次都返回索引和值的引用。您選擇兩次都使用引用,并且值被修改但您繼續附加相同的地址。這就是為什么你只得到最后一個值,范圍循環不斷修改它,你只剩下循環中的最后一個值。

方法一:

為避免這種情況,請將循環更改為而for index := range k不是for _,item := range k使用循環中的索引并附加k[index]而不是項目。

方法二:

for _, item range something {
  item := item

如果你想保持你的語法不變,你可以在循環內創建一個局部變量,使用你從范圍中獲得的變量。添加item := item兩個循環塊的第一行。雖然看起來很奇怪,但這item每次都會分配新的,您將追加并使用變量。


查看完整回答
反對 回復 2023-06-19
  • 2 回答
  • 0 關注
  • 144 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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