繁体   English   中英

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

[英]What is the equivalent of "id" function of Python in Golang?

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 %p\n", &i, &i)
    fmt.Printf("%p is not %p\n", &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 %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 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


包 cmp

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

包 cmp 确定值的相等性。

该包旨在成为reflect.DeepEqual 的更强大和更安全的替代方案,用于比较两个值在语义上是否相等。

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

package main

import "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 0xc000016100
0xc000016100 is not 0xc000016108

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM