以下代码按照我对Julia中的Python样式列表的预期:
julia> list1 = [Any, 123]
2-element Array{Any,1}:
Any
123
julia> list1[1] = "ABC"
"ABC"
julia> list1
2-element Array{Any,1}:
"ABC"
123
但是,此代码没有:
julia> list2 = [Any]
1-element Array{DataType,1}:
Any
julia> list2[1] = "ABC"
ERROR: MethodError: Cannot `convert` an object of type String to an object of type DataType
我没想到以下两者之间会有这样的差异:
julia> list1 = [Any, 123]
# and
julia> list2 = [Any]
所以我尝试使用any
而不是Any
:
julia> list3 = [any, 123]
2-element Array{Any,1}:
any
123
julia> list3[1] = "ABC"
"ABC"
julia> list3
2-element Array{Any,1}:
"ABC"
123
这一切都奏效了,但后来我尝试了:
julia> list4 = [any]
1-element Array{typeof(any),1}:
any
julia> list4[1] = "ABC"
ERROR: MethodError: Cannot `convert` an object of type String to an object of type typeof(any)
Julia 的类型推断是怎么回事,它解释了为什么list = [Any]
或[any]
会产生错误消息,如上所示,但如果在创建"列表"时添加另一种类型,事情可以正常工作?
编辑
基于下面接受的答案中的有用示例,这适用于在Julia中创建Python风格的"列表":
julia> pylist = Array{Any}(nothing, 5)
5-element Array{Any,1}:
nothing
nothing
nothing
nothing
nothing
julia> pylist[1] = 123
123
julia> pylist[2] = 3.14
3.14
julia> pylist[3] = "ABC"
"ABC"
julia> pylist[4] = BigInt(12345)
12345
julia> pylist[5] = BigFloat(123.456)
1.234560000000000030695446184836328029632568359375e+02
编辑 2
这是另一个例子,但我在朱莉娅身边的时间还不够长,不知道这是否被认为是"朱利安"。 感谢Julia专家的任何评论:
julia> PyList(n) = Array{Any}(nothing, n)
PyList (generic function with 1 method)
对于其他不熟悉 Julia 的人来说,这两行代码也可能有所帮助。
julia> Vector{Any}(nothing, 3)
3-element Array{Any,1}:
nothing
nothing
nothing
julia> Vector{Any}(nothing, 3) == Array{Any}(nothing, 3)
true
因此,上面示例中的Vector{Any}
只是Array{Any}
的别名。 以下是一些使用PyList
的示例。
julia> pylst = PyList(3)
3-element Array{Any,1}:
nothing
nothing
nothing
julia> pylst[1] = "ABC"
"ABC"
julia> pylst[2] = 123
123
julia> pylst[3] = 3.14
3.14
julia> pylst
3-element Array{Any,1}:
"ABC"
123
3.14
[Any, 123]
并不意味着"使用单元素 123 制作元素类型 Any 的 1 元素数组"。它的意思是"用元素 Any 和 123 创建一个数组"。Any 的元素类型是从给定的元素推导出来的,因为 Any 和 123 具有完全不相关的类型。
同样,[Any]
的意思是"用单个元素 Any 创建一个数组"。元素类型推导为数据类型。
如果要显式创建元素类型 Any 的数组,可以通过将类型放在文本前面来执行此操作。例如,元素类型Any
的数组具有单个元素nothing
:
arr = Any[nothing]
还有一些方法可以创建指定大小的数组,例如
# 2x3 array of Any, all elements initialized to nothing
arr = Array{Any}(nothing, 2, 3)
Python列表接受任何类型的元素并且大小不固定,因此要创建一个新Vector{Any}
,在 Julia 中您只需执行Any[]
(注释在 Python 中(:
julia> x = Any[] # >>> x = []
0-element Array{Any,1} # >>> x
# []
julia> push!(x, 1) # >>> x.append(1)
1-element Array{Any,1}: # >>> x
1 # [1]
julia> push!(x, "2") # >>> x.append("2")
2-element Array{Any,1}: # >>> x
1 # [1, '2']
"2"
WhithoutAny
Julia 推断下一个数组理解是Vector{Int}
型的,因此您将无法用其他类型的元素推送或更改它的Int
元素。
julia> y = Any[i^2 for i in 1:3] # >>> y = [i**2 for i in range(1, 4)]
3-element Array{Any,1}: # >>> y
1 # [1, 4, 9]
4
9
julia> push!(y, "16") # >>> y.append("16")
4-element Array{Any,1}: # >>> y
1 # [1, 4, 9, '16']
4
9
"16"
您可以使用两种语言创建实用程序函数以满足您的需求。
julia> list() = Any[] # >>> list
list (generic function with 1 method) # <type 'list'>
julia> list(n::Integer) = Vector{Any}(undef, n) # >>> def nlist(n):
list (generic function with 2 methods) # ... return [None for i in range(n)]
julia> list() # >>> list()
0-element Array{Any,1} # []
julia> list(3) # >>> nlist(3)
3-element Array{Any,1}: # [None, None, None]
#undef
#undef
#undef