我正在尝试在 python 中编写等效于以下行的内容H = [e for e in G if condition(e)]这是我的示例代码。基本上我只是想使用 getter 函数 (G.get) 来获取G. 所以我想我想arr2成为一个新的数组,但包含相同的对象。package mainimport "fmt"type Object struct { x int}type Group []Objectfunc (G *Group) get() (H []Object) { for _,v := range *G { H = append(H,v) } return}func main() { arr := make(Group,1) arr[0].x = 1 fmt.Println(arr) arr2 := arr.get() arr[0].x = 3 fmt.Println(arr) fmt.Println(arr2)}哪个编译并运行并给我[{1}][{3}][{1}]我的问题是“为什么不arr2包含与 相同的对象实例arr?” 我相信我理解make只实例化一个Group东西,这意味着它包含一个Object东西。但是 for 循环不应该创建一个新的Object应该吗?
1 回答
守候你守候我
TA贡献1802条经验 获得超10个赞
这个更简单的代码片段显示了发生了什么:
var a Object
a.x = 1
b := a
fmt.Println(a, b) // prints {1} {1}
b.x = 2
fmt.Println(a, b) // prints {1} {2}
该语句b := a将Object变量中的值复制a到变量中b。现在有两个值的副本。改变一个不会改变另一个。
这与 Python 不同,在 Python 中赋值复制对值的引用。
问题中的循环也复制值:
for _,v := range *G {
H = append(H,v)
}
变量v是切片元素的副本*G。的副本v附加到 slice H。存在三个独立的 Object 值: slice 中的值、 slice*G中的值v和 slice 中的值H。
如果您希望切片都引用相同的Object值,则Object在切片中存储指向值的指针:
type Group []*Object
arr := make(Group, 1)
arr[0] = &Object{x: 1}
fmt.Println(arr[0].x) // prints 1
arr2 := arr.get()
arr[0].x = 3
fmt.Println(arr[0].x) // prints 3
fmt.Println(arr2[0].x) // prints 3
- 1 回答
- 0 关注
- 267 浏览
添加回答
举报
0/150
提交
取消