julia - Julia 中的 objectid()、hash()、pointer_from_obj() 和 pointer() 有什么区别?
问题描述
objectid()
, hash()
,pointer()
和pointer_from_objref()
Julia有什么区别?
比较的运算符是什么===
?
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.
解决方案
pointer
适用于数组和字符串,并pointer(x)
返回Ptr{X}
whereX
is 存储的类型x
(极端情况是标准字符串在 base 中,尽管UInt8
is )。这为您提供了存储数据的指针;两个不同的对象可以让指针比较为真,例如,你会得到(尽管这些指针有不同的类型);eltype
String
Char
==
x=[1]
y=reinterpret(UInt8, x)
pointer(x) == pointer(y)
pointer_from_objref
适用于任何可变对象并返回Ptr{Nothing}
. 对于数组和字符串,这与pointer
因为数组/字符串也有一些存储在实际数据之前的元数据不同。objectid
- 正如文档所说,这是一个基于规则的哈希,如果两个对象x
并且y
具有一个x===y
为真的属性,那么它们应该具有相同objectid
的(实际的实现有点复杂,以x===y
正确地覆盖规则 - 例如s1 = "12"
,并且s2 = "12"
将最可能返回不同的值,pointer
但从那时s1 === s2
起objectid
将返回相同的值;hash
是基于not的标准哈希值。这意味着例如两个数组和将具有相同的散列(因为它们具有相同的内容并且使用 比较相等)但是由于使用比较时它们不相同,所以它们不同isequal
===
x=[1]
y=[1]
isequal
objectid
===
===
表示比较测试传递给它的对象是否无法区分。在大多数情况下使用的简单规则是:- 对象对于不可变对象具有相同的值
- 对象对于可变对象具有相同的内存位置
(最后一条规则有点棘手,例如两个字符串s1="12"
并s2="12"
使用相等比较,===
因为它们是不可变的,但实际上它们可以使用函数区分)pointer
因此,您可以看到规则有点复杂,以确保在常见情况下用户得到他们所期望的。
推荐阅读
- python - 有没有一种简单的方法可以在 Python 或 PIL 中调整/扩展只有零的图像?
- r - 如何以分组格式获取输出并将相同格式导出到 csv 文件中?
- typescript - 我可以让 TypeScript 显示它为表达式确定的类型吗?
- php - 为什么在 Moodle 3.3 中出现 SQL 语法错误?
- solidity - 如何修复“VM错误:无效的操作码。无效的操作码”
- python - Ffmpeg:缩放+裁剪视频然后叠加图像?
- mongodb - MongoDB 不会安装在 Windows 7 机器上
- c# - 为数据库插入优先级
- azure - 如何在 Azure 中的新数据库上运行数据库迁移?
- python - 如何编写一个 for 或 while 循环,将列表的值从初始索引值打印到结束值?