Golang中Python的“ id”函数等效于什么?

时间:2019-12-18 02:55:39

标签: python go

Golang中Python的“ id”函数等效于什么?

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

对于Golang中的相同内容,我发现您可以使用this answer中提到的函数DeepEqual。但是,我想知道Python中是否有一个id等效项,而tbh是相当方便的函数。

3 个答案:

答案 0 :(得分:4)

@satoru posted:

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


  

package cmp

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

包装cmp确定值的相等性。

     

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

答案 1 :(得分:0)

对于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

答案 2 :(得分:0)

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

  

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

如果要比较两个指针值,则可以简单地使用==:如果两个指针指向同一对象,则它们相等。如果两个指针值不相等,尽管它们可能仍指向具有相同内容的对象,所以p1==p2可能为false,而DeepEqual(*p1,*p2)可能为true。