Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python golang中的数组子集_Python_Arrays_Pointers_Go - Fatal编程技术网

Python golang中的数组子集

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

我正试图用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 := 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)]