下面的代码就像我预期的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
Run Code Online (Sandbox Code Playgroud)
但是,这段代码没有:
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
Run Code Online (Sandbox Code Playgroud)
我没想到这样的区别:
julia> list1 = [Any, 123]
# and
julia> list2 = [Any]
Run Code Online (Sandbox Code Playgroud)
所以我尝试使用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
Run Code Online (Sandbox Code Playgroud)
这一切都奏效了,但后来我尝试了:
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)
Run Code Online (Sandbox Code Playgroud)
如上所示,Julia的类型推断是如何解释原因list = [Any]或[any]产生错误消息的,但事情是否正常如果在"list"创建中添加了另一种类型?
编辑
基于下面接受的答案中的有用示例,这适用于在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
Run Code Online (Sandbox Code Playgroud)
编辑2
这是另一个例子,但我没有在Julia周围足够长的时间来知道这是否被认为是"朱利安".任何来自Julia专家的评论都表示赞赏:
julia> PyList(n) = Array{Any}(nothing, n)
PyList (generic function with 1 method)
Run Code Online (Sandbox Code Playgroud)
对于朱莉娅的新手,这两行代码也可能有所帮助
julia> Vector{Any}(nothing, 3)
3-element Array{Any,1}:
nothing
nothing
nothing
julia> Vector{Any}(nothing, 3) == Array{Any}(nothing, 3)
true
Run Code Online (Sandbox Code Playgroud)
因此,Vector{Any}上面的例子中的a只是一个别名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
Run Code Online (Sandbox Code Playgroud)
[Any, 123]并不意味着"使用单个元素123制作元素类型Any的1元素数组".它的意思是"使用元素Any和123创建一个数组".Any的元素类型是从给定的元素推导出来的,因为Any和123具有完全不相关的类型.
类似地,[Any]意味着"使用单个元素Any制作数组".元素类型推导为DataType.
如果要显式创建元素类型为Any的数组,可以通过将类型放在文字前面来实现.例如,Any具有单个元素的元素类型数组nothing:
arr = Any[nothing]
Run Code Online (Sandbox Code Playgroud)
还有一些方法可以创建指定大小的数组,例如
# 2x3 array of Any, all elements initialized to nothing
arr = Array{Any}(nothing, 2, 3)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
360 次 |
| 最近记录: |