Julia函数参数引用

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仍然在父范围内引用它的变量.


col*_*ang 8

我认为这里的文件有点模糊.

严格来说,Julia是"按值调用,值是参考",或"按分享调用",如python,java,ruby,js等大多数语言所使用的...查看wiki

通过引用行为调用确实会将foo!零更改为1.然而朱莉娅不支持这一点.(如果你知道C#,那是什么ref或者out做什么)

  • 我也看到过术语“指针调用”(或“指针传递”)用来指代这一点,我认为这很简短。无论如何,总是值得提醒的是,这些术语有时是出于语言理论的目的,有时是出于实践的目的。而且这些含义并不总是一致的,甚至在不同学科之间甚至取决于作者! (2认同)

Kad*_*nel 7

为了改变数组中的每个变量,.可以使用广播操作。但请注意,数组中的每个值都将被同等更改,因此不需要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使用索引循环是不可避免的。