Seltsames Verhalten des Anhängens in Go

王林
Freigeben: 2024-02-02 14:13:26
nach vorne
980 Leute haben es durchsucht

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

}
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!