以下代码按照我对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
答案 0 :(得分:5)
[Any, 123]
并不意味着“使用单一元素123制作元素类型为Any的1元素数组”。这意味着“用元素Any和123组成一个数组”。 Any的元素类型是从给定的元素推导出来的,因为Any和123具有完全不相关的类型。
类似地,[Any]
的意思是“用单个元素Any创建一个数组”。元素类型推导为DataType。
如果要显式创建元素类型为Any的数组,可以通过将类型放在文字前面来实现。例如,具有单个元素Any
的元素类型nothing
的数组:
arr = Any[nothing]
还有一些方法可以创建指定大小的数组,例如
# 2x3 array of Any, all elements initialized to nothing
arr = Array{Any}(nothing, 2, 3)
答案 1 :(得分:2)
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"
没有Any
的情况下,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