gpt4 book ai didi

python - golang 中数组的子集

转载 作者:IT王子 更新时间:2023-10-29 01:42:52 25 4
gpt4 key购买 nike

我正在尝试用 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 吗?

感谢您的帮助!

最佳答案

这段更简单的代码片段显示了正在发生的事情:

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}

playground example

语句 b := a 将变量 a 中的 Object 值复制到变量 b 中。现在有两个值的副本。改变一个不会改变另一个。

这与 Python 不同,在 Python 中,赋值将引用复制到一个值。

问题中的循环也复制值:

for _,v := range *G {
H = append(H,v)
}

变量v*G 的slice 元素的副本。 v 的副本附加到 slice H。存在三个独立的对象值: slice *G中的值、v中的值和 slice H中的值。

如果您希望 slice 都引用相同的 Object 值,则将指向 Object 值的指针存储在 slice 中:

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

playground example

关于python - golang 中数组的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28133288/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com