This understanding seems about right. If you're familiar with C, Julia variables can be thought of as pointers to dynamically allocated objects in memory; passing an argument causes a new variable to have the same pointer value – but they still refer to the same object in memory.
> On Sep 26, 2014, at 10:44 PM, Ethan Anderes <[email protected]> wrote: > > 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? > >
