首页 > 解决方案 > 切片附加有奇怪的行为

问题描述

有人可以向我解释为什么 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]]

标签: arraysgoappendslice

解决方案


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


推荐阅读