Golang中Python的“id”函数相当于什么?

Golang中Python的“id”函数相当于什么?

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

对于 Golang 中的相同情况,我发现您可以使用此答案中提到的函数DeepEqual 。但我想知道 Python 中是否有一个相当于 id 的函数,这确实是一个非常方便的函数。


繁华开满天机
浏览 134回答 3
3回答

蝴蝶不菲

package mainimport "fmt"func main() {    i := 32    j := 32    fmt.Printf("%p is %p\n", &i, &i)    fmt.Printf("%p is not %p\n", &i, &j)}输出:0xc000016100 is 0xc0000161000xc000016100 is not 0xc000016108游乐场:https://play.golang.org/p/nXAEJeImeXa然而,package mainimport "fmt"func main() {    i := 32    j := 32    fmt.Printf("i %p is i %p; i == i %t\n", &i, &i, &i == &i)    fmt.Printf("i %p is not j %p; i == j %t\n", &i, &j, &i == &j)    fmt.Println()    var v struct {        i struct{}        j struct{}    }    fmt.Printf("i %p is i %p; i == i %t\n", &v.i, &v.i, &v.i == &v.i)    fmt.Printf("i %p is not j %p; i == j %t\n", &v.i, &v.j, &v.i == &v.j)}输出:i 0x40e020 is i 0x40e020; i == i truei 0x40e020 is not j 0x40e024; i == j falsei 0x1e52bc is i 0x1e52bc; i == i truei 0x1e52bc is not j 0x1e52bc; i == j true游乐场:https://play.golang.org/p/Wv814ZgPCul封装CMPimport "github.com/google/go-cmp/cmp"cmp 包确定值的相等性。该包旨在成为 Reflect.DeepEqual 的更强大、更安全的替代方案,用于比较两个值在语义上是否相等。

凤凰求蛊

使用 CPython,id返回内存中对象的地址。在 Go 中,您可以通过 & 符号获取指向对象的指针:package mainimport "fmt"func main() {    i := 32    j := 32    fmt.Printf("%p is %p\n", &i, &i)    fmt.Printf("%p is not %p\n", &i, &j)}上面示例的输出在我的机器上如下所示:0xc000016100 is 0xc0000161000xc000016100 is not 0xc000016108

倚天杖

您可以用来DeepEqual比较两个对象的内容。但是,我不认为 python 就是id这么做的。从 python 中的定义来看id,您所追求的似乎是指针等效,而不是DeepEqual. id状态的函数定义这是一个整数,保证该对象在其生命周期内是唯一且恒定的。如果要比较两个指针值,则可以简单地使用==:如果两个指针指向同一对象,则它们相等。如果两个指针值不相等,它们仍然可能指向具有相同内容的对象,因此p1==p2可能为假,但DeepEqual(*p1,*p2)也可能为真。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go