我正在制作一個簡單的質因數函數,它可以放置一個[][]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})

呼如林
TA貢獻1798條經驗 獲得超3個贊
Range 的語法每次都返回索引和值的引用。您選擇兩次都使用引用,并且值被修改但您繼續附加相同的地址。這就是為什么你只得到最后一個值,范圍循環不斷修改它,你只剩下循環中的最后一個值。
方法一:
為避免這種情況,請將循環更改為而for index := range k
不是for _,item := range k
使用循環中的索引并附加k[index]
而不是項目。
方法二:
for _, item range something { item := item
如果你想保持你的語法不變,你可以在循環內創建一個局部變量,使用你從范圍中獲得的變量。添加item := item
兩個循環塊的第一行。雖然看起來很奇怪,但這item
每次都會分配新的,您將追加并使用該變量。
- 2 回答
- 0 關注
- 144 瀏覽
添加回答
舉報
0/150
提交
取消