在Julia中,使用
Vector{Type}()
和Type[]
表达式来初始化一个空的Type
向量是完全等价的吗?这两种语法哪种更受青睐?Vector{Type}()
和Type[]
表达式来初始化一个空的Type
向量是完全等价的吗?这两种语法哪种更受青睐?是的,它们实际上是完全相同的:
julia> @code_typed Vector{Any}()
CodeInfo(:(begin
return $(Expr(:foreigncall, :(:jl_alloc_array_1d), Array{Any,1}, svec(Any, Int64), Array{Any,1}, 0, 0, 0))
end))=>Array{Any,1}
julia> @code_typed Any[]
CodeInfo(:(begin
return $(Expr(:foreigncall, :(:jl_alloc_array_1d), Array{Any,1}, svec(Any, Int64), Array{Any,1}, 0, 0, 0))
end))=>Array{Any,1}
Type[]
语法实际上与所有其他 x[]
语法一样,它会扩展为 getindex(Type)
。而且你可以在这里看到,它是基于 Array
构造函数定义的。这只是一种方便的缩写。
我不知道有哪些风格指南更喜欢其中之一。T[]
存在至少一个问题:请参阅 https://discourse.julialang.org/t/performance-issue-with-use-of-eltype/5764 和 https://github.com/JuliaLang/julia/issues/23618 以获取更多详细信息。 - sbromberger
Vector{Int64}(a)
的情况:对于a=0
,这是一个空向量,但对于任何其他的a,它都是一个初始化了垃圾值的向量。 - Tasos Papastylianou