Stephan:
Just as an addendum to Stefan and John’s comments, the following small
change to your code will mutate x:
function f!(x)
x[:]=x+1
y=x+1
end
end
Notice, I put a ! at the end of the function name. This is just convention
to warn the user that the argument may be mutated. Coming form Matlab, the
way I reason about this is that everything behaves the same, as far as
local scope for x is concerned. The difference is that in Matlab, the input
array is copied and assigned to the local x, whereas in Julia the address
of the input array is copied and assigned to the local x. Therefore x = x +
1 says assign x to a new address in memory (which wouldn’t change the
global scope x since the function scope is blind to it, just as in Matlab).
On the other hand x[:] = x + 1 says “go to where x is addressed and put in
the value x + 1”. So, in the Julia way, the global scope x address hasn’t
changed, but f! just scooped out the values living in those locations and
changed them. I’m probably rambling a bit after a few friday night beers
but I hope it helps.
BTW: it is entirely possible that my working understanding is not the right
way to explain it. Feel free, and be sure to, correct me if I’m not saying
it right.
Cheers!
Ethan
On Friday, September 26, 2014 1:51:37 PM UTC-7, Stephan Buchert wrote:
>From the manual
> Argument Passing Behavior: ...means that values are not copied when they
> are passed to functions. ...Modifications to mutable values (such as
> Arrays) made within a function will be visible to the caller.
>
> I get
> julia> function f(x)
> x=x+1
> y=x+1
> end
> f (generic function with 1 method)
>
> julia> x=[1:5]'
> 1x5 Array{Int64,2}:
> 1 2 3 4 5
>
> julia> y=f(x)
> 1x5 Array{Int64,2}:
> 3 4 5 6 7
>
> julia> x
> 1x5 Array{Int64,2}:
> 1 2 3 4 5
>
> Apparently Array x is copied inside the function, at least in this case,
> and this is not visible to the caller (here made indirectly visible). The
> manual is confusing for me. And what is the difference between my example
> and the double! function from the manuals style guide, which does actually
> modify the function argument?
>
>