> > instead, it puts the same object (which is a copy) in the first and third > positions and you get the same behavior. Maybe this is not the intended > behavior of deepcopy? >
It's intentional. deepcopy has to keep and update a dictionary as it traverses the datastructure in order to provide the behaviour. Without it, it would be impossible to copy cyclic data-structures, as the recursive traversal would never end. On Sunday, August 14, 2016 at 11:36:04 AM UTC-4, Tommy Hofmann wrote: > > Indeed, the behavior of deepcopy with respect to arrays of user defined > types is surprising. > > If you define > > Base.deepcopy_internal(x::MyType, ::ObjectIdDict) = MyType(deepcopy(x.a)) > > then deepcopy(MyType_Vec[[1, 3, 1]]) gives a new object with "independent" > elements. See also > http://docs.julialang.org/en/release-0.4/stdlib/base/#Base.deepcopy > > > On Friday, August 12, 2016 at 8:56:32 PM UTC+2, Josh Langsfeld wrote: >> >> For your second question, I would have expected just doing >> deepcopy(MyType_Vec[[1,3,1]]) would have created a new array with a new >> object allocated for each element. Instead, it puts the same object (which >> is a copy) in the first and third positions and you get the same behavior. >> Maybe this is not the intended behavior of deepcopy? >> >> You can easily get around though this by explicitly calling deepcopy on >> each element directly: MyType_Vec = map(deepcopy, MyType_Vec[[1,3,1]]). >> A similar alternative with an array comprehension would be: MyType_Vec = >> [deepcopy(MyType_Vec[i]) for i in [1,3,1]]. >> >> (an array comprehension also answers your first question: MyType_Vec = >> [MyType([0.0]) for i=1:3]) >> >> On Friday, August 12, 2016 at 11:47:39 AM UTC-4, Jan wrote: >> >> I have a beginner question for which I cannot find the answer after quite >>> some searching. >>> >>> >>> type MyType >>> a::Array{Float64,1} >>> end >>> >>> # Fill an array with "independent" instances of MyType. (By the way, is >>> there a shorter way to do this?) >>> >>> MyType_Vec = Array(MyType, 3); >>> >>> for i in eachindex(MyType_Vec) >>> >>> MyType_Vec[i] = MyType([0.0]); >>> >>> end >>> >>> MyType_Vec >>> >>> # Change the value of MyType_Vec[1].a[1] to 2. >>> >>> MyType_Vec[1].a[1] = 2; >>> >>> MyType_Vec >>> >>> # Shuffle the vector but with repeated elements >>> >>> MyType_Vec = MyType_Vec[[1,3,1]]; >>> >>> # Change the value of MyType_Vec[1].a[1] to 4. >>> >>> MyType_Vec[1].a[1] = 4; >>> >>> MyType_Vec >>> >>> # The value of MyType_Vec[3].a[1] also changed to 4. >>> >>> >>> How can I avoid this reference behaviour? I want that, after the >>> shuffling step, the 3 elements of MyType_Vec should be "independent" so >>> that if I change MyType_Vec[1].a[1] nothing else is affected. I have >>> tried copy and deepcopy without success. >>> >>> I would be very happy if someone could help me out. I'm stuck... >>> >>> Many thanks in advance. >>> >> >> >
