为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我的追加函数会将切片的每个成员更改为要添加的新项目?

为什么我的追加函数会将切片的每个成员更改为要添加的新项目?

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 关注
  • 76 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信