gpt4 book ai didi

range - 对外部范围的理解丢失输出类型

转载 作者:行者123 更新时间:2023-12-01 00:54:47 24 4
gpt4 key购买 nike

另一个新手问题,我发现这种差异非常令人困惑:

it = 1:3
typeof([i^2 for i in 1:3]) # Array{Int64,1}
typeof([i^2 for i in it]) # Array{Any,1}

为什么定义范围很重要?
typeof([i^2 for i in it::UnitRange{Int64}])似乎给出了提示, this discussion 也是如此.然而,不管上述行为的原因是什么,实际的问题是:我如何指定/强制理解的输出类型?

编辑:一个更完整的例子说明了两个不同的问题,
# global namespace

nu1 = 0.5 + [0 ,1:3]
nu2 = 0.5 + (0:3)
typeof([besselj(_nu,[1,2]) for _nu in nu1]) # Any
typeof([besselj(_nu,[1,2]) for _nu in nu2]) # Any
typeof([besselj(_nu,[1,2]) for _nu in 0.5 + (0:3)]) # correct inference

# within a function

function rb()
nu = 0.5 + [0 ,1:3]
bj = [besselj(_nu,[1,2]) for _nu in nu]
end

function rb2()
nu = 0.5 + (0:3)
bj = [besselj(_nu,[1,2]) for _nu in nu]
end

typeof(rb()) # Any
typeof(rb2())# Correct inference

我首先在一个函数中遇到了这个问题,其中使用向量与范围会产生不同的输出类型,在尝试解决这个问题时,我在全局命名空间中进行了实验并遇到了另一个问题......

最佳答案

考虑以下代码

it = 1:3
@show typeof([i^2 for i in 1:3])
@show typeof([i^2 for i in it])

function foo()
it = 1:3
@show typeof([i^2 for i in 1:3])
@show typeof([i^2 for i in it])
end

foo()

产生
typeof($(Expr(:comprehension, :(i^2), :(i = 1:3)))) => Array{Int64,1}
typeof($(Expr(:comprehension, :(i^2), :(i = it)))) => Array{Any,1}
typeof($(Expr(:comprehension, :(i^2), :(i = 1:3)))) => Array{Int64,1}
typeof($(Expr(:comprehension, :(i^2), :(i = it)))) => Array{Int64,1}

基本上,全局范围内的类型推断要困难得多,而 Julia 主要针对它。这通常不是问题,因为所有“真实”代码都是范围良好的,并且不在 REPL 上运行。数组推导式有时可能存在类型推断问题,尽管通常有一些原因(即您“推导式”的东西没有具体类型,或者您在推导式中评估的函数不是类型稳定的)。您始终可以使用类型化向量的常用语法让 Julia 知道输出应该是什么类型,即
it = 1:3
x = [i^2 for i in 1:3]
@show typeof(x) # typeof(x) => Array{Int64,1}
y = Int[i^2 for i in it]
@show typeof(y) # typeof(y) => Array{Int64,1}

但我不希望通常需要这个。当然,有些人喜欢对他们的类型断言/声明非常明确,所以如果你想确定的话,你可以使用它。

关于range - 对外部范围的理解丢失输出类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28820824/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com