我正在制作一个简单的质因数函数,它可以放置一个[][]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 关注
- 105 浏览
添加回答
举报
0/150
提交
取消