朱莉娅·朗:错误?初始化可为空的数组



我正在尝试初始化具有给定大小的可为空整数的数组。我的目的是将元素添加到数组中,并能够计算数组中 Nullable 元素的数量。

但是我注意到以下行为。运行以下代码:

function main()
arr = Array{Nullable{Int}}(10)
res = 0
for i in 1:10
if isnull(arr[i])
res += 1
end
end
res    
end

预计返回 10,但是程序几乎每次运行代码时都会返回不同的值。仅初始化数组:

function main()
arr = Array{Nullable{Int}}(10)  
end

这是结果:

Nullable{Int64}(7142821636481377634)
Nullable{Int64}(8803814271447229814)
Nullable{Int64}(7935455170894001012)
Nullable{Int64}(8247625210579135584)
Nullable{Int64}(7815275285807655200)
Nullable{Int64}()
Nullable{Int64}()
Nullable{Int64}()
Nullable{Int64}()
Nullable{Int64}()

在这里可以看到,并非所有元素实际上都不是 Null。这可以解释为什么函数isnull((不将它们识别为Null对象。

这是所需的效果:

function main()
arr = Array{Nullable{Int}}(10)
for i in 1:10
arr[i] = Nullable{Int}()
end
println(arr)  
end

它确实返回一个可为空的元素数组。但是,运行此代码进行初始化似乎有点乏味。

知道如何避免这种情况吗?

在 Julia 0.6 中,您可以使用arr = fill(Nullable{Int64}(),10).

但请注意,Nullable 在 Julia 0.7 (https://github.com/JuliaLang/julia/blob/master/NEWS.md( 中已折旧,请考虑改用NothingMissing类型:

julia> vector_with_nothing_or_int = Vector{Union{Int64, Nothing}}(nothing,10)
10-element Array{Union{Nothing, Int64},1}:
nothing
nothing
[...]
julia> vector_with_missing_or_int = Vector{Union{Int64, Missing}}(missing,10)
10-element Array{Union{Missing, Int64},1}:
missing
missing
[...]

检查元素是否没有或缺失可以通过以下方式完成:

julia> vector_with_nothing_or_int[1] == nothing
true
julia> ismissing(vector_with_missing_or_int[1])
true

Missing类型也适用于 Julia 0.6 如果您加载模块Missings。这是 Julia 0.6 的相应代码:

using Missings    
vector_with_missing_or_int = Vector{Union{Int64, Missing}}(10)
vector_with_missing_or_int .= missing
vector_with_nothing_or_int = Vector{Union{Int64, Nothing}}(10)
vector_with_nothing_or_int .= nothing

运算符.=将数组的每个元素替换为右侧的元素。所有这些示例也适用于多维数组,如果在指定维数时将Vector替换为Array

最新更新