Re: part assigned sequence behavior puzzling
- To: mathgroup at smc.vnet.net
- Subject: [mg105267] Re: part assigned sequence behavior puzzling
- From: mkr <mileskrains at gmail.com>
- Date: Wed, 25 Nov 2009 23:00:30 -0500 (EST)
- References: <heimgd$58a$1@smc.vnet.net> <hej41o$dfp$1@smc.vnet.net>
On Nov 25, 3:22 am, "Sjoerd C. de Vries" <sjoerd.c.devr... at gmail.com> wrote: > I don't think you're wrong. I was just as puzzled with this behaviour > as you. I'd say it's a bug. Just look at the following : > > Using extra temporary variables works as expected: > > In[283]:= tmp = Range[15]; > tmp[[7]] = Sequence @@ Range[2]; > tmp2 = tmp; > tmp2[[7]] = Sequence @@ Range[2]; > tmp3 = tmp2; > tmp3[[7]] = Sequence @@ Range[2]; > tmp3 > > Out[289]= {1, 2, 3, 4, 5, 6, 1, 2, 2, 2, 8, 9, 10, 11, 12, 13, 14, 15} > > Using different locations in tmp works as expected: > > In[295]:= tmp = Range[15]; > tmp[[3]] = Sequence @@ Range[2]; > tmp[[5]] = Sequence @@ Range[2]; > tmp[[7]] = Sequence @@ Range[2]; > tmp > > Out[299]= {1, 2, 1, 2, 4, 1, 2, 6, 1, 2, 8, 9, 10, 11, 12, 13, 14, 15} > > Temporarily storing tmp somewhere else works as expected: > > In[311]:= tmp = Range[15]; > tmp[[7]] = Sequence @@ Range[2]; > tmp2 = tmp; > tmp = 0; > tmp = tmp2; > tmp[[7]] = Sequence @@ Range[2]; > tmp2 = tmp; > tmp = 0; > tmp = tmp2; > tmp[[7]] = Sequence @@ Range[2]; > tmp > > Out[321]= {1, 2, 3, 4, 5, 6, 1, 2, 2, 2, 8, 9, 10, 11, 12, 13, 14, 15} > > My original hypothesis of what happens here was that Mathematica > optimizes assignments and remembers what it last assigned to a > location in an array. If it is the same, it does nothing. This would > work for all elements except Sequence. > > This hypothesis is falsified by the following tests in which I changed > the ranges: > > In[392]:= tmp = Range[15]; > tmp[[7]] = Sequence @@ Range[2]; > tmp[[7]] = Sequence @@ Range[3]; > tmp[[7]] = Sequence @@ Range[4]; > tmp > > Out[396]= {1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 8, 9, 10, 11, 12, 13, 14, 15} > > In[397]:= tmp = Range[15]; > tmp[[7]] = Sequence @@ Range[4]; > tmp[[7]] = Sequence @@ Range[3]; > tmp[[7]] = Sequence @@ Range[2]; > tmp > > Out[401]= {1, 2, 3, 4, 5, 6, 1, 2, 8, 9, 10, 11, 12, 13, 14, 15} > > As you can see, only the last range sticks. > > A new hypothesis would be to assume that Mathematica stores lists as a > table of pointers to the list members and that a Sequence not causes > the list to get extra pointers but that the Sequence is still > invisible lurking there with a single pointer pointing to it. Copying > the array may flatten out this structure, so that every member now > gets his own pointer: > > In[402]:= tmp = Range[15]; > tmp[[7]] = Sequence @@ Range[2]; tmp = tmp; > tmp[[7]] = Sequence @@ Range[2]; tmp = tmp; > tmp[[7]] = Sequence @@ Range[2]; tmp = tmp; > tmp > > Out[406]= {1, 2, 3, 4, 5, 6, 1, 2, 2, 2, 8, 9, 10, 11, 12, 13, 14, 15} > > This seems to confirm the hypothesis. > > The problem seems to be in Set, as Part works OK: > In[476]:= tmp = Range[15]; > tmp[[7]] = Sequence @@ Range[2]; {tmp[[7]], tmp[[8]], tmp[[9]]} > tmp[[8]] = Sequence @@ Range[2]; {tmp[[7]], tmp[[8]], tmp[[9]]} > tmp[[9]] = Sequence @@ Range[2]; {tmp[[7]], tmp[[8]], tmp[[9]]} > tmp > > Out[477]= {1, 2, 8} > > Out[478]= {1, 2, 1} > > Out[479]= {1, 2, 1} > > Out[480]= {1, 2, 3, 4, 5, 6, 1, 2, 1, 2, 1, 2, 10, 11, 12, 13, 14, 15} > > Could you report this to supp... at wolfram.com? > > Cheers -- Sjoerd > > On Nov 25, 9:31 am, mkr <mileskra... at gmail.com> wrote: > > > > > I am puzzled by the following behavior: > > > tmp = Range[15] > > tmp[[7]] = Sequence @@ Range[2]; > > tmp[[7]] = Sequence @@ Range[2]; > > tmp[[7]] = Sequence @@ Range[2]; > > tmp > > > yields > > > {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15} > > {1, 2, 3, 4, 5, 6, 1, 2, 8, 9, 10, 11, 12, 13, 14, 15} > > > I would have expected the repeated assignment to have a repeated > > effect, thus obtaining > > > {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15} > > {1, 2, 3, 4, 5, 6, 1, 2, 2, 2, 8, 9, 10, 11, 12, 13, 14, 15} > > > Where/why am I wrong?- Hide quoted text - > > - Show quoted text - Thanks for the reply. I have submitted this to WRI tech support as a possible bug, including reference to your much more thorough analysis here.