julia - 在 julia 中声明和更改变量值的问题
问题描述
我的代码有什么问题?我必须x
在使用前声明吗?
function f(n::Int64, t::Int64)
A = ones(n,n)
for i=0:t
if i > 0
A[x,a] = rand()*A[x,a] + rand()
end
y = rand(1:n)
b = rand(1:n)
if i > 0
A[x,a] = rand()*A[x,a] + rand()*A[y,b]
end
x = y
a = min(b, rand(1:n))
end
return A
end
这是尝试调用时引发的错误f
:
UndefVarError: x 未定义
解决方案
我认为原因更复杂,因为 Python 中的类似代码会起作用。
例如比较(Python):
>>> def f():
... for i in range(3):
... if i > 0:
... print(a)
... a = i
...
>>> f()
0
1
给(朱莉娅):
julia> function f()
for i in 0:2
if i > 0
println(a)
end
a = i
end
end
f (generic function with 1 method)
julia> f()
ERROR: UndefVarError: a not defined
那么区别是什么呢?正如 Julia 手册在这里解释的那样,你有:
for
循环、while
循环和推导具有以下行为:在其主体范围内引入的任何新变量都为每次循环迭代重新分配,就好像循环体被一个let
块包围
这意味着在您的代码变量中a
,x
由于它们是循环的本地变量,因此在for
循环的每次迭代中都是新分配的。因此,必须在循环内访问变量之前对其进行分配。
因此,不需要在循环之前和之前分配值。x
a
在循环外部的范围内定义它们就足够了(即使没有分配值)。例如像这样:
julia> function f(n::Int64, t::Int64)
A = ones(n,n)
local x, a
for i=0:t
if i > 0
A[x,a] = rand()*A[x,a] + rand()
end
y = rand(1:n)
b = rand(1:n)
if i > 0
A[x,a] = rand()*A[x,a] + rand()*A[y,b]
end
x = y
a = min(b, rand(1:n))
end
return A
end
f (generic function with 1 method)
julia> f(1,1)
1×1 Array{Float64,2}:
0.94526289614139
现在它可以工作了,因为x
并且a
没有在循环的每次迭代中新分配。
在我原来的玩具示例中,它看起来像:
julia> function f()
local a
for i in 0:2
if i > 0
println(a)
end
a = i
end
end
f (generic function with 2 methods)
julia> f()
0
1
你会看到你得到的正是你在 Python 中所拥有的。
推荐阅读
- javascript - 当 ctx 沿 X 轴移动时,如何更改画布 globalAlpha
- unit-testing - 在没有 DI 的情况下在 golang 中模拟和监视
- javascript - 在 Python 中使用请求时如何绕过 JavaScript 检测?
- oracle - 使用 ssis 连接到 Oracle 数据库
- python - 如何构建一个空表以最终保存一个时间戳列和两个浮点列,严格使用 numpy 并且不允许使用 pandas?
- android - Android 从右向左滑动以展开片段
- spring - 如何将值从表单传递:选择在spring boot中的控制器
- python - 分而治之的排序算法难度
- jquery - 在 jquery 中使用数据表时使用列名检索行数据
- android - react-native-camera 未在 Android 上触发