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

我正在制作一个简单的质因数函数,它可以放置一个[][]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

}


小怪兽爱吃肉
浏览 84回答 2
2回答

有只小跳蛙

您创建切片一次,然后每次都对其进行修改,因此每次都in添加完全相同的对象。k改为附加一个新切片:k=append(k,[]int{item,&nbsp;tok})

呼如林

Range 的语法每次都返回索引和值的引用。您选择两次都使用引用,并且值被修改但您继续附加相同的地址。这就是为什么你只得到最后一个值,范围循环不断修改它,你只剩下循环中的最后一个值。方法一:为避免这种情况,请将循环更改为而for index := range k不是for _,item := range k使用循环中的索引并附加k[index]而不是项目。方法二:for&nbsp;_,&nbsp;item&nbsp;range&nbsp;something&nbsp;{ &nbsp;&nbsp;item&nbsp;:=&nbsp;item如果你想保持你的语法不变,你可以在循环内创建一个局部变量,使用你从范围中获得的变量。添加item := item两个循环块的第一行。虽然看起来很奇怪,但这item每次都会分配新的,您将追加并使用该变量。
打开App,查看更多内容
随时随地看视频慕课网APP