为什么在使用tuple或Tuple转换向量时得到以下不同的结果
julia> a = [1, 2, 3]
3-element Vector{Int64}:
1
2
3
julia> tuple(a)
([1, 2, 3],)
julia> Tuple(a)
(1, 2, 3)然而,广播也产生了同样的结果:
julia> tuple.(a)
3-element Vector{Tuple{Int64}}:
(1,)
(2,)
(3,)
julia> Tuple.(a)
3-element Vector{Tuple{Int64}}:
(1,)
(2,)
(3,)(后者并不奇怪,因为它只是将单个数字转换为元组。)
(这是Julia 1.6.1。)
发布于 2022-02-23 16:18:49
Tuple是一个类型,与Julia中的所有集合一样,如果将另一个集合传递给它,它将从另一个集合的内容创建该类型的实例。因此,Tuple([1, 2, 3])构造了值1、2和3的元组,就像Set([1, 2, 3])构造了一组相同的值一样。类似地,如果编写Dict([:a => 1, :b => 2, :c => 3]),就会得到一个包含对:a => 1、:b => 2和:c => 3的dict。当构造函数的参数是迭代器时,这也能很好地工作;下面的例子如下:
julia> Tuple(k^2 for k=1:3)
(1, 4, 9)
julia> Set(k^2 for k=1:3)
Set{Int64} with 3 elements:
4
9
1
julia> Dict(string(k, base=2, pad=2) => k^2 for k=1:3)
Dict{String, Int64} with 3 entries:
"10" => 4
"11" => 9
"01" => 1这就是为什么Tuple的工作方式是这样的。另一方面,tuple函数是一个从其参数中生成元组的函数,如下所示:
julia> tuple()
()
julia> tuple(1)
(1,)
julia> tuple(1, "two")
(1, "two")
julia> tuple(1, "two", 3.0)
(1, "two", 3.0)为什么有tuple而不是只拥有Tuple呢?您可以将最后一个示例表示为Tuple([1, "two", 3.0])。但是,这需要构造一个临时的非类型化数组来迭代它并从它的内容中生成一个元组,这实际上是效率低下的。如果有一种更有效的容器类型,编译器通常可以消除.就像一个元组。为此,我们将编写Tuple((1, "two", 3.0))。它可以工作,但是是完全多余的,因为(1, "two", 3.0)已经是您想要的元组了。那么你为什么要使用tuple呢?大多数情况下,您只使用(1, "two", 3.0)语法来构造元组。但是有时您需要一个实际的函数,您可以将它应用于一些值,以获得它们的一个元组--而tuple就是这个函数。实际上,您可以创建一个很容易做到这一点的匿名函数:(args...) -> (args...,)。您只需将tuple看作是该函数的一个方便的缩写。
https://stackoverflow.com/questions/71239909
复制相似问题