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?
> 
> ​

Reply via email to