茱莉亚(Julia)中的objectid()
,hash()
,pointer()
和pointer_from_objref()
有什么区别?
与===
比较的运算符是什么?
julia> L1 = [1,2,3];
julia> L2 = L1;
julia> L3 = copy(L1);
julia> objectid(L1), objectid(L2), objectid(L3)
(0xac55c2b098913d98, 0xac55c2b098913d98, 0xbdee7946bbc068f0)
julia> hash(L1), hash(L2), hash(L3)
(0xecc5186e7be222c6, 0xecc5186e7be222c6, 0xecc5186e7be222c6)
julia> pointer_from_objref(L1), pointer_from_objref(L2), pointer_from_objref(L3)
(Ptr{Nothing} @0x00007f6888141e40, Ptr{Nothing} @0x00007f6888141e40, Ptr{Nothing} @0x00007f68881438f0)
julia> pointer(L1), pointer(L2), pointer(L3)
(Ptr{Int64} @0x00007f6888141e80, Ptr{Int64} @0x00007f6888141e80, Ptr{Int64} @0x00007f6888143930)
从文档中:
objectid(x)
Get a hash value for x based on object identity. objectid(x)==objectid(y) if x === y.
hash(x[, h::UInt])
Compute an integer hash code such that isequal(x,y) implies hash(x)==hash(y).
pointer_from_objref(x)
Get the memory address of a Julia object as a Ptr.
pointer(array [, index])
Get the native address of an array or string, optionally at a given location index.
答案 0 :(得分:2)
pointer
适用于数组和字符串,并且pointer(x)
返回Ptr{X}
,其中X
是存储在x
中的类型(特殊情况是基数中的标准字符串)尽管UInt8
中的eltype
是String
,但它是Char
的位置)。这为您提供了存储数据的指针;两个不同的对象可以使指针与==
比较为真,例如使用x=[1]
和y=reinterpret(UInt8, x)
,您将获得pointer(x) == pointer(y)
(尽管这些指针具有不同的类型); pointer_from_objref
对任何 mutable 对象起作用,并返回Ptr{Nothing}
。对于数组和字符串,这与pointer
不同,因为数组/字符串还具有一些存储在实际数据之前的元数据。objectid
-正如文档所述,是基于以下规则的哈希:如果两个对象x
和y
具有x===y
为真的属性,则它们应该具有相同的objectid
(实际实现有点复杂,无法正确覆盖x===y
规则-例如s1 = "12"
和s2 = "12"
将很可能返回不同的值,例如pointer
,但自s1 === s2
之后,objectid
将在它们上返回相同的值; hash
是 standard 哈希值,其基于isequal
而不基于===
。这意味着两个数组x=[1]
和y=[1]
将具有相同的哈希值(因为它们具有相同的内容,并使用isequal
比较相等),但是具有不同的objectid
,因为它们不相同与===
===
表示比较测试,确定传递给它的对象是否不可区分。在大多数情况下使用的简单规则是:
(最后一条规则有点棘手,例如两个字符串s1="12"
和s2="12"
使用===
比较相等,因为它们是不可变的,但实际上它们是可以区分的。 em>使用pointer
函数)
因此,您可以看到规则很复杂,以确保在通常情况下用户能够得到期望的结果。