在Golang中"id" Python的函数相当于什么?



在Golang中Python的"id"函数相当于什么?

id是我通常用于比较两个对象在 Python 中是否相同的内容(通过交叉检查它们的"id"是否相同。当然也有例外 - 就像有时在 PyTorch 张量中一样,但大多数情况下这是有效的(。

对于Golang中的相同内容,我发现您可以使用此答案中提到的函数,即DeepEqual。但是想知道 Python 中是否有等效的 id,tbh 是一个非常方便的函数。

@satoru发布:

package main
import "fmt"
func main() {
i := 32
j := 32
fmt.Printf("%p is %pn", &i, &i)
fmt.Printf("%p is not %pn", &i, &j)
}

输出:

0xc000016100 is 0xc000016100
0xc000016100 is not 0xc000016108

游乐场:https://play.golang.org/p/nXAEJeImeXa


然而

package main
import "fmt"
func main() {
i := 32
j := 32
fmt.Printf("i %p is i %p; i == i %tn", &i, &i, &i == &i)
fmt.Printf("i %p is not j %p; i == j %tn", &i, &j, &i == &j)
fmt.Println()
var v struct {
i struct{}
j struct{}
}
fmt.Printf("i %p is i %p; i == i %tn", &v.i, &v.i, &v.i == &v.i)
fmt.Printf("i %p is not j %p; i == j %tn", &v.i, &v.j, &v.i == &v.j)
}

输出:

i 0x40e020 is i 0x40e020; i == i true
i 0x40e020 is not j 0x40e024; i == j false
i 0x1e52bc is i 0x1e52bc; i == i true
i 0x1e52bc is not j 0x1e52bc; i == j true

游乐场:https://play.golang.org/p/Wv814ZgPCul


包装总动员

import "github.com/google/go-cmp/cmp"

包 cmp 确定值的相等性。

此软件包旨在成为功能更强大,更安全的替代方案 来反思。用于比较两个值在语义上是否为的深度相等 平等。

使用 CPython,id返回内存中对象的地址。在 Go 中,您可以获得指向带有 & 符号的对象的指针:

package main
import "fmt"
func main() {
i := 32
j := 32
fmt.Printf("%p is %pn", &i, &i)
fmt.Printf("%p is not %pn", &i, &j)
}

上面示例的输出在我的机器上如下所示:

0xc000016100 is 0xc000016100
0xc000016100 is not 0xc000016108

您可以使用DeepEqual来比较两个对象的内容。但是,我不认为这是pythonid所做的。从 python 中id的定义来看,指针等价似乎是你所追求的,而不是DeepEqualid状态的函数定义

这是一个整数,保证此对象在其生存期内是唯一且恒定的。

如果要比较两个指针值,则可以简单地使用==:如果两个指针指向同一事物,则它们是相等的。如果两个指针值不相等,它们可能仍指向具有相同内容的对象,因此p1==p2可能是假的,但DeepEqual(*p1,*p2)可能是真的。

最新更新