Python golang中的数组子集
我正试图用python编写下面这行的等效代码Python golang中的数组子集,python,arrays,pointers,go,Python,Arrays,Pointers,Go,我正试图用python编写下面这行的等效代码 H=[e代表e,如果条件(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 := rang
H=[e代表e,如果条件(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
只实例化一个组
对象,这意味着它包含一个对象
。但是for循环不应该创建新的对象
应该吗
谢谢你的帮助 这个简单的代码片段显示了发生了什么:
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
将变量a
中的对象
值复制到变量b
。现在该值有两个副本。改变一个不会改变另一个
这与Python不同,Python中的赋值将引用复制到值
问题中的循环还复制了以下值:
for _,v := range *G {
H = append(H,v)
}
变量v
是从*G
复制切片元素。将v
的副本附加到切片H
。有三个独立的对象值:切片*G
中的值、v
中的值和切片H
中的值
如果希望所有切片都引用相同的对象
值,则在切片中存储指向对象
值的指针:
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
很好的解释!了解
:=
复制值很好。另外,您是否知道是否有更好的方法执行[e for e in G if condition(e)]
?