arrays - slice append 的行为异常

标签 arrays go append slice

有人可以向我解释为什么temp的值决定在最后一条输出线上更改,即使temp只是列表数组的副本吗?

func subsets(nums []int) [][]int {
    
    if len(nums) == 0 {
        return [][]int{[]int{}}
    }
    
    list := [][]int{[]int{nums[0]}}
    
    for _, n := range nums[1:]{
        list = append(list, []int{n})
        temp := list[:len(list)-1]
        fmt.Println(temp)
        for _, arr := range temp {
            arr = append(arr, n)
            list = append(list, arr)
        }
       
        fmt.Println(temp)
        fmt.Println("  ")
    }
    
    list = append(list, []int{})
    return list
    
}
output:
[[1]]
[[1]]
  
[[1] [2] [1 2]]
[[1] [2] [1 2]]
  
[[1] [2] [1 2] [3] [1 3] [2 3] [1 2 3]]
[[1] [2] [1 2] [3] [1 3] [2 3] [1 2 3]]
  
[[1] [2] [1 2] [3] [1 3] [2 3] [1 2 3] [4] [1 4] [2 4] [1 2 4] [3 4] [1 3 4] [2 3 4] [1 2 3 4]]
[[1] [2] [1 2] [3] [1 3] [2 3] [1 2 3] [4] [1 4] [2 4] [1 2 4] [3 4] [1 3 4] [2 3 4] [1 2 3 5]]

最佳答案

实际上,您是在复制 slice ,而不是数组。
slice 是数组段的描述符。它由一个指向数组的指针,段的长度及其容量(段的最大长度)组成。
这意味着,您只是在创建slice标题的副本。底层数组仍被共享。
https://blog.golang.org/slices-intro

关于arrays - slice append 的行为异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63475401/

相关文章:

Javascript 数组拼接而不改变索引

python - ArrayField 中的 Django JSONField

c - 如何在获取输入的同时在数字数组中创建实时动态内存分配?

inheritance - 使用设置保护值的 Golang 继承

go - 字符串到 char (*array)[]

jquery - Ajax 替换而不是追加

r - 如何将较小的 DataFrame append 到 R 中的另一个 DataFrame

arrays - 计算向量中小于另一个向量中每个元素的值

go - 清理临时文件的最佳方法

javascript - jQuery append() 与 appendChild()