我试图在python
中写下以下行的等价物 H = [e for e in G if condition(e)]
这是我的示例代码。基本上我只是尝试使用getter函数(G.get)来获取G
的子集。所以我想我希望arr2
成为一个新数组但包含相同的对象。
package main
import "fmt"
type Object struct {
x int
}
type Group []Object
func (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
吗?
感谢您的帮助!
答案 0 :(得分:2)
这个更简单的代码片段显示了正在发生的事情:
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不同,其中赋值复制对值的引用。
问题中的循环还会复制值:
for _,v := range *G {
H = append(H,v)
}
变量v
是来自*G
的切片元素的副本。 v
的副本会附加到切片H
。有三个独立的Object值:切片*G
中的值,v
中的值和切片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