Julia 中的 Python 样式列表



以下代码按照我对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"

WhithoutAnyJulia 推断下一个数组理解是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

最新更新