Maison  >  Article  >  développement back-end  >  Comportement étrange de l'ajout dans Go

Comportement étrange de l'ajout dans Go

王林
王林avant
2024-02-02 14:13:261022parcourir

Go 中追加的奇怪行为

Contenu de la question

J'essaie de résoudre le problème de sous-ensemble sur LeetCode en utilisant Go. J'ai trouvé la solution suivante :

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

}

Cependant, cette solution est incorrecte. J'ai remarqué que je devais utiliser append(sol,append([]int{},temp...)) au lieu de simplement sol=append(sol,temp).

Même si l'instruction fmt.Println(temp,append([]int{}, temp...)) génère la même sortie pour temp et append([]int{}, temp...), utilisez append([ ]int {}, temp...) fonctionne réellement. Quelqu'un peut-il expliquer la différence entre temp et append([]int{}, temp...) dans ce cas ? Pourquoi la version corrigée fonctionne-t-elle mais pas la version initiale ?

On s'attend à ce que temp et append([]int{},temp...) soient identiquestempappend([]int{},temp...) 相同


正确答案


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

Bonne réponse

Le problème avec sol =append(sol, temp) est que vous ajoutez la tranche temp au sol au lieu du élément "à l'intérieur" de la tranche. Comme mentionné dans le

Article de blog interne de Slicetemp 在每次迭代中重用,因此 temp 切片下的数组内容将被覆盖,并且您之前添加到 sol 的切片内的值也将被覆盖已修改(因为切片下的数组已修改)。这就是为什么您最终得到错误结果的原因,即使您的 fmt.Println 语句显示在附加之前, temp, une tranche est "juste" un pointeur vers un tableau, sa longueur et sa capacité.

Donc, dans votre cas, puisque append([]int{}, temp...) a la bonne valeur.

🎜Lorsque 🎜 crée une nouvelle tranche, la valeur de la nouvelle tranche ne peut pas changer car elle n'est pas réutilisée. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer