In Julia, all of the x OP= y have the same semantics: you can always replace them with x = x OP y.
This takes a bit of getting used to, but I personally find it makes the copying behavior natural. -- John On May 1, 2014, at 9:39 AM, Dominique Orban <[email protected]> wrote: > I would have expected b .+= 5 to change b in place, but it doesn't seem to be > the case. Isn't it counter-intuitive that it would also make a copy? > > On Thursday, May 1, 2014 6:54:10 AM UTC-7, Freddy Chua wrote: > do this > > b = [1:5] > f(x) = x + 5 > map!(f, b) > > On Thursday, May 1, 2014 9:03:35 PM UTC+8, Kevin Squire wrote: > b[:] = b .+ 5 > > has the behavior that you want. However, it creates a copy, does the > addition, then copies the result back into b. > > So, looping (aka devectorizing) would generally be faster. For simple > expressions like these, though, the Devectorize.jl package should allow you > to write > > @devec b[:] = b .+ 5 > > It then rewrites the expression as a loop. It isn't able to recognize some > expressions, though (especially complex ones), so YMMV. > > (Actually, it may not work with ".+", since that is a relatively new change > in the language. If you check and it doesn't, try submitting a github issue, > or just report back here.) > > Cheers! Kevin > > On Thursday, May 1, 2014, Kaj Wiik <[email protected]> wrote: > OK, thanks, makes sense. But how to change the original instance, is looping > the only way? > > On Thursday, May 1, 2014 3:12:51 PM UTC+3, Freddy Chua wrote: > b = b .+ 5 > > creates a new instance of an array, so the original array pointed to by "b" > is not changed at all. > > > > On Thursday, May 1, 2014 7:39:14 PM UTC+8, Kaj Wiik wrote: > As a new user I was surprised that even if you change the value of function > arguments (inside the function) the changes are not always visible outside > but in some cases they are. > > Here's an example: > > function vappu!(a,b) > a[3]=100 > b = b .+ 5 > (a,b) > end > > c = [1:5] > d = [1:5] > > vappu!(c,d) > ([1,2,100,4,5],[6,7,8,9,10]) > > c > 5-element Array{Int64,1}: > 1 > 2 > 100 > 4 > 5 > d > 5-element Array{Int64,1}: > 1 > 2 > 3 > 4 > 5 >
