Julia 的字典方法 `haskey` 在存在键时返回 false
Julia's dictionary method `haskey` returning false when key is present
我是 Julia 的新手,我不确定为什么最后一行的计算结果为 false:
type Point{T}
x::T
y::T
end
D = [Point(1.,2.) => 42]
haskey(D, Point(1., 2.)) #False!
显然密钥存在,所以这是怎么回事!?
编辑。
如果我不使用 class Point
,它工作正常:
D = [(1.,2.) => 42]
haskey(D, (1., 2.)) #True!
我们可以不对字典键类型使用 classes 吗?
但是看看这个:
type Point{T}
x::T
y::T
end
P = Point(1., 2.)
D = [P => 42]
haskey(D, P)
计算为 true
。
如果您使用相同的对象,它确实有效,但如果您使用具有相同字段值的 2 个对象,则它无效。请注意,使用 type
定义的对象是可变的,因此即使在您使用 Point
作为键之后,您仍然可以在字典不知道的情况下更改其字段的值。字典需要散列一些不能改变的东西,比如类型对象的标识,而不是当前的字段值。由于元组是不可变的,它们的值可以安全地用作键。你也可以使用
immutable Point{T}
x::T
y::T
end
如果您为 Point
定义一个自定义 hash
方法,那么一切都会如您所愿。
我是 Julia 的新手,我不确定为什么最后一行的计算结果为 false:
type Point{T}
x::T
y::T
end
D = [Point(1.,2.) => 42]
haskey(D, Point(1., 2.)) #False!
显然密钥存在,所以这是怎么回事!?
编辑。
如果我不使用 class Point
,它工作正常:
D = [(1.,2.) => 42]
haskey(D, (1., 2.)) #True!
我们可以不对字典键类型使用 classes 吗?
但是看看这个:
type Point{T}
x::T
y::T
end
P = Point(1., 2.)
D = [P => 42]
haskey(D, P)
计算为 true
。
如果您使用相同的对象,它确实有效,但如果您使用具有相同字段值的 2 个对象,则它无效。请注意,使用 type
定义的对象是可变的,因此即使在您使用 Point
作为键之后,您仍然可以在字典不知道的情况下更改其字段的值。字典需要散列一些不能改变的东西,比如类型对象的标识,而不是当前的字段值。由于元组是不可变的,它们的值可以安全地用作键。你也可以使用
immutable Point{T}
x::T
y::T
end
如果您为 Point
定义一个自定义 hash
方法,那么一切都会如您所愿。