您的位置:首页 > 教程笔记 > 综合教程

Go 中追加的奇怪行为

2024-02-05 12:34:53 综合教程 44

问题内容

我正在尝试使用 Go 解决 LeetCode 上的子集问题。我想出了以下解决方案:

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

}

但是,这个解决方案是不正确的。我注意到我需要使用append(sol,append([]int{},temp…))而不是仅仅sol=append(sol,temp)。

即使 fmt.Println(temp,append([]int{}, temp…)) 语句为 temp 和append([]int{}, temp…) 生成相同的输出,使用append([]int{}, temp…) 的更正版本实际上有效。有人可以解释在这种情况下 temp 和 append([]int{}, temp…) 之间的区别吗?为什么修正后的版本可以工作,而初始版本却不能?

预计 和 相同

正确答案

的问题是您将切片 添加到 中,而不是切片“内部”的项目。正如 Slice 内部博客文章 中所述,切片“只是”指向数组的指针、长度和容量。

因此,在您的情况下,由于 在每次迭代中重用,因此 切片下的数组内容将被覆盖,并且您之前添加到 的切片内的值也将被覆盖已修改(因为切片下的数组已修改)。这就是为什么您最终得到错误结果的原因,即使您的 语句显示在附加之前, 具有正确的值。

当 创建一个新切片时,新切片内的值不可能发生变化,因为它没有被重用。

相关推荐

  • 探索Go语言切片的重要性:为何它如此关键?

    探索Go语言切片的重要性:为何它如此关键?

    Go语言切片初探:为什么它如此重要?作为一门静态类型编程语言,Go语言在处理数组时提供了一种强大且灵活的方式,那就是切片(slice)。在Go语言中,切片是对数组的一个引用,它并不存储任何数据,只是描

    综合教程 2024-02-05 12:34:42 154
  • 使用pip升级Python版本的简易指南

    使用pip升级Python版本的简易指南

    一步步教你使用pip升级Python版本,需要具体代码示例导语:Python是一种功能强大的编程语言,常用于开发应用程序和网站。随着Python不断的发展和更新,升级Python版本变得非常重要。本文

    综合教程 2024-02-05 12:34:38 195
  • 一步轻松:检查Python的pip版本

    一步轻松:检查Python的pip版本

    简单方法:查询Python的pip版本,需要具体代码示例一、引言Python是目前非常流行的编程语言之一,它的功能强大且易于学习和使用。Python社区提供了各种各样的工具和库,其中最受欢迎的之一就是

    综合教程 2024-02-05 12:34:36 49
  • Go语言切片底层的实现原理和优势分析揭秘

    Go语言切片底层的实现原理和优势分析揭秘

    解密Go语言切片的底层实现原理与优势分析在Go语言中,切片(slice)是一个重要的数据结构,它提供了方便、灵活且高效的数组操作方式。切片的底层实现原理和优势是每个Go语言开发者都应该了解的内容。本文

    综合教程 2024-02-05 12:34:29 117
  • 掌握numpy数组拼接方法的关键技巧:简易入门指南

    掌握numpy数组拼接方法的关键技巧:简易入门指南

    快速入门:掌握numpy数组拼接方法的关键技巧在数据分析和机器学习领域中,经常需要对多个数组进行拼接,以便进行后续的操作和分析。NumPy作为Python中最常用的数值计算库,提供了丰富的数组操作函数

    前端笔记 2024-01-29 10:57:27 92