Thanks Tomas, the similar command will be very useful in avoiding this issue.
Thank you also for a thoughtful and informative response, Tomas. Bradley PS - For what it's worth, R does not have this behavior. On Friday, December 26, 2014 2:05:44 PM UTC-6, Tomas Lycken wrote: > > The main reason is performance; passing and aliasing arrays this way > (those are two different concepts, which work together to make this > particular example a little confusing) allow for writing code that is as > fast as possible, by leaving the coder in control of when a copy is made > and when it is not. A more idiomatic way of writing your square function, > which would do what you expect, would be > > ``` > function square(A) > A2 = similar(A) > for i = 1:length(A) > A2[i] = A[i]^2 > end > A2 > end > ``` > > The funciton `similar` allocates new memory for an array of similar size > and type as `A`. You could also have left your entire method untouch except > setting `inner_var = copy(arg)`, but this would have meant both reading and > writing more to memory than you need to. As you see, Julia's behavior > allows you to write more performant code than what you'd do otherwise. > > // Tomas > > On Friday, December 26, 2014 8:58:04 PM UTC+1, Bradley Setzler wrote: >> >> Why would you want this behavior? How could you possibly benefit from >> modifying X anytime you modify Y just because Y=X initially? If I wanted to >> modify X, I would modify X itself, not Y. >> >> Bradley >> >> >> >> >> On Friday, December 26, 2014 1:53:12 PM UTC-6, John Myles White wrote: >>> >>> This is aliasing. Almost all languages allow this. >>> >>> -- John >>> >>> Sent from my iPhone >>> >>> On Dec 26, 2014, at 2:49 PM, Bradley Setzler <[email protected]> >>> wrote: >>> >>> Hi, >>> >>> I cannot explain this behavior. I apply a function to a variable in the >>> workspace, the function initializes its local variable at the workspace >>> variable, then modifies the local variable and produces the desired output. >>> However, it turns out the Julia modifies both the local and workspace >>> variable with each operation on the local variable. Only the local variable >>> is supposed to be modified. >>> >>> *This is very dangerous behavior, as Julia is modifying the data itself >>> between performing operations on the data; the data itself is supposed to >>> remain fixed between operations on it.* >>> >>> *Minimal working example:* >>> >>> data=[1,2,3] >>> function square(arg) >>> inner_var = arg >>> for i=1:length(inner_var) >>> inner_var[i] = inner_var[i]^2 >>> end >>> return inner_var >>> end >>> output=square(data) >>> >>> julia> print(data) >>> >>> [1,4,9] >>> >>> The data has been squared due to the local variable, which was >>> initialized at the data values, being squared. Now, if i wish to apply a >>> different function to the data, the result will be incorrect because the >>> data has been modified unintentionally. >>> >>> How long has Julia been doing this? Was this behavior intentional? >>> Bradley >>> >>> >>>
