Heim >Backend-Entwicklung >Golang >Seltsames Verhalten des Anhängens in Go

Seltsames Verhalten des Anhängens in Go

王林
王林nach vorne
2024-02-02 14:13:261049Durchsuche

Go 中追加的奇怪行为

Frageninhalt

Ich versuche, das Teilmengenproblem auf LeetCode mit Go zu lösen. Ich habe mir folgende Lösung ausgedacht:

func subsets(nums []int) [][]int {
    sol := make([][]int,0)
    temp:= make([]int,0)

    var backtrack func(idx int)
    backtrack = func(idx int) {
        sol = append(sol, temp)
        fmt.Println(temp, append([]int{},temp...))

        if idx == len(nums) {
            return
        }

        for i:= idx; i<len(nums);i++{
            temp = append(temp,nums[i])
            backtrack(i+1)
            temp = temp[:len(temp)-1]
        }

    }
    backtrack(0)
    return sol

}

Diese Lösung ist jedoch falsch. Mir ist aufgefallen, dass ich append(sol,append([]int{},temp...)) statt nur sol=append(sol,temp) verwenden muss.

Obwohl die fmt.Println(temp,append([]int{}, temp...))-Anweisung die gleiche Ausgabe für temp und append([]int{}, temp...) generiert, verwenden Sie append([ ]int {}, temp...) funktioniert tatsächlich. Kann jemand in diesem Fall den Unterschied zwischen temp und append([]int{}, temp...) erklären? Warum funktioniert die korrigierte Version, die ursprüngliche Version jedoch nicht?

Es wird erwartet, dass temp und append([]int{},temp...) gleich sindtempappend([]int{},temp...) 相同


正确答案


sol =append(sol, temp) 的问题是您将切片 temp 添加到 sol

Richtige Antwort

Das Problem mit sol =append(sol, temp) besteht darin, dass Sie das Slice temp zum sol anstelle des hinzufügen Element „innerhalb“ des Slice. Wie im

Slice-internen Blogbeitragtemp 在每次迭代中重用,因此 temp 切片下的数组内容将被覆盖,并且您之前添加到 sol 的切片内的值也将被覆盖已修改(因为切片下的数组已修改)。这就是为什么您最终得到错误结果的原因,即使您的 fmt.Println 语句显示在附加之前, temp erwähnt, ist ein Slice „nur“ ein Zeiger auf ein Array, seine Länge und Kapazität.

In Ihrem Fall also, da append([]int{}, temp...) den richtigen Wert hat.

🎜Wenn 🎜 ein neues Slice erstellt, kann sich der Wert innerhalb des neuen Slice nicht ändern, da er nicht wiederverwendet wird. 🎜

Das obige ist der detaillierte Inhalt vonSeltsames Verhalten des Anhängens in Go. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen