Hi Eric, I think you’re being confused by the distinction between the bindings of variables and values, which can be bound to variables.
If w is an Array, then an expression like w = [1, 2, 3] assigns a value (namely the value of an array containing 1, 2 and 3) to the variable w. In contrast, an expression like w[1] = 4 does not refer to a variable called w[1]. It refers to a position in memory whose value is being mutated to 4. — John On Jan 24, 2014, at 9:01 PM, Eric Ford <ericbf...@gmail.com> wrote: > Hi Ivar, > > Thanks for the idea. But replacing w += 10 with w = w + 10 still gives the > same problem. (As does w = w .+ 10). > Either way, after calling f2, the values of x are modified. > > Even stranger, the values of x are not modified by the following function > function f3(x::Array) > w = x + 0. > for i in 1:length(w) > w[i] = w[i] + 10.0 > end > return w > end > So the behavior of future lines of code depends on whether w is initialized > as w = x or w = x + 0. > > It appears that for some reason, julia is doing different things when the > right hand side is just an array, versus when it is an expression. > Maybe somebody considers that a feature, but it's definitely non-intuitive. > > I can't find any mention of this in the documentation. Amusingly, there > appears to be basically no documentation for what "=" does (despite it being > the most common symbol in most every julia program). > I thought = might be implemented as a generic function with different > behaviors for Arrays and expressions, but methods(=) and help(=) turned up > nothing. > On one hand, it seems, like = should be fairly obvious, but evidently there > are currently important differences in the behavior of = that need to be > documented and/or corrected. > > Cheers, > Eric > > > On Friday, January 24, 2014 2:38:53 PM UTC-5, Ivar Nesje wrote: > It becomes more obvious if you write "a += 3" as the longer form "a = a + 4" > > kl. 19:57:22 UTC+1 fredag 24. januar 2014 skrev Eric Ford følgende: > Sorry. (Evidently, downloading a notebook is based on the last saved version > and what's currently on your screen.) IJulia notebook attached. Readable > version below. > > function f1(x::Array) > w = x > w += 10.0 > return w > end > > function f2(x::Array) > w = x > for i in 1:length(x) > w[i] += 10.0 > end > return w > end > > x=randn(10) > x_orig = deepcopy(x) > f1_of_x = f1(x) > println("After f1: ",sum((x.-x_orig).^2)); > x = deepcopy(x_orig) > f2_of_x = f2(x) > println("After f2: ",sum((x.-x_orig).^2)); > > After f1: 0.0 > After f2: 1000.0 > > Thanks, > Eric > > > On Friday, January 24, 2014 1:10:59 PM UTC-5, Kevin Squire wrote: > In what you posted, `f1` and `f2` are identical (except for the name). Can > you share the output of a Julia or IJulia session showing the problem? > > Cheers, > Kevin > > > On Fri, Jan 24, 2014 at 9:58 AM, Eric Ford <eric...@gmail.com> wrote: > I don't understand why the first function doesn't change x, but the second > function does. > Is the = calling deepcopy in f1, but copy in f2? > If so, why? > > function f1(x::Array) > w = x > for i in 1:length(x) > w[i] += 10.0 > end > w += 10.0 > return w > end > > function f2(x::Array) > w = x > for i in 1:length(x) > w[i] += 10.0 > end > w += 10.0 > return w > end > > x=randn(10) > x_orig = deepcopy(x) > f_of_x = f(x) > sum((x.-x_orig).^2) > > After f1: 0.0 > After f2: 1000.0 > > Thanks, > Eric (on behalf of an Astro 585 student) > >