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)
> 
> 

Reply via email to