Julia中Vector{Any}与[]的区别及限定类型向量创建问题
Julia 向量类型与
push!问题解答 问题1:为什么a = Vector{T}得到DataType类型,push!失效?
在Julia中,Vector是参数化类型构造器,Vector{Any}、Vector{Vector{Int}}这类写法返回的是类型对象(DataType),而非该类型的实际容器实例。
push!函数的作用对象是容器的实例(具体的向量对象),而非类型本身。对DataType调用push!时,Julia找不到对应方法,因此触发MethodError。a = []是Julia的语法糖,会直接创建Vector{Any}的空实例,属于可操作的容器对象,所以push!能正常执行。
示例对比:
# 这是类型对象,不是实例 a_type = Vector{Any} typeof(a_type) # 返回 DataType # 这是实例,可以正常push a_instance = [] typeof(a_instance) # 返回 Vector{Any} push!(a_instance, [1,2,3]) # 正常执行
问题2:如何创建支持push!操作的限定类型向量?
要创建可push!的限定类型向量,需生成该类型的空实例,常用方式如下:
直接调用类型构造函数:
# 创建空的、元素为Vector{Int}的向量 a = Vector{Vector{Int}}() push!(a, [1,2,3]) # 正常执行,元素类型匹配使用
undef初始化空向量(与上方式效果一致):a = Vector{Vector{Int}}(undef, 0)数组字面量语法(更简洁):
# 用 [] 包裹限定类型的空数组,生成对应类型的空向量 a = Vector{Int}[] push!(a, [4,5,6]) # 正常执行
注意:若使用Vector{Vector{Int}}(undef, n)(n>0),会创建包含n个未初始化元素的向量,此时push!会在末尾追加元素,但需注意未初始化元素的潜在风险。
内容的提问来源于stack exchange,提问作者lafinur
相关产品推荐
相关产品推荐

