arrays - 切片附加有奇怪的行为
问题描述
有人可以向我解释为什么 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]]
解决方案
实际上,您正在复制切片,而不是数组。切片是数组段的描述符。它由指向数组的指针、段的长度及其容量(段的最大长度)组成。这意味着,您只是在创建切片标题的副本。底层数组仍然是共享的。 https://blog.golang.org/slices-intro
推荐阅读
- flutter - 展开的周围飘动的灰线
- javascript - 如何使用 javascript 在 div 中附加 iframe
- java - 在 Java 中实现堆栈
- python - Python字典:迭代字典的不同方式
- laravel - 基于列值的 Foreach 内部的 Foreach
- reactjs - 反应本机按钮不适合屏幕
- reactjs - React Spring Simple Transition - Transform3d 和不透明度在转换时不完全为 0
- javascript - 我如何将strapi作为CMS集成到我的网站中,这意味着我不希望所有后端都使用strapi构建,
- docusaurus - 使用 Docusaurus v2 的选项卡中的 Markdown 内容
- typescript - 引用由 sequelize typescript + PostgreSQL 中的两个主键定义的表