Lin*_*don 13 reference pass-by-reference julia
文档说
在Julia中,函数的所有参数都通过引用传递.
所以我很惊讶地看到这两个函数的行为有所不同:
function foo!(r::Array{Int64})
r=r+1
end
function foobar!(r::Array{Int64})
for i=1:length(r)
r[i]=r[i]+1
end
end
Run Code Online (Sandbox Code Playgroud)
这是意想不到的不同输出:
julia> myarray
2-element Array{Int64,1}:
0
0
julia> foo!(myarray);
julia> myarray
2-element Array{Int64,1}:
0
0
julia> foobar!(myarray);
julia> myarray
2-element Array{Int64,1}:
1
1
Run Code Online (Sandbox Code Playgroud)
如果数组是通过引用传递的,我会期待foo!将零更改为1.
Rez*_*lan 19
r=r+1是一个Assignment语句,这意味着它重新分配r,因此它不再引用父作用域中的对.但是r[i]=r[i]+1 变量 r值,变异与赋值不同(这里有一个很好的描述),之后r仍然在父范围内引用它的变量.
为了改变数组中的每个变量,.可以使用广播操作。但请注意,数组中的每个值都将被同等更改,因此不需要for循环。
在对数组的每个元素加 1 的情况下:
a = rand(1:10, 10)
show(a) = [4, 8, 9, 1, 4, 2, 6, 7, 1, 5]
function add1!(a::Array{Int64})
a .= a .+ 1
end
add1!(a);
show(a) = [5, 9, 10, 2, 5, 3, 7, 8, 2, 6]
Run Code Online (Sandbox Code Playgroud)
尽管如此,如果需要独立更改数组的每个值,则for使用索引循环是不可避免的。
| 归档时间: |
|
| 查看次数: |
7270 次 |
| 最近记录: |