Thanks a lot, Justin! That's good to know. Incidentally, isn't it a bit 
inconsistent to have different behaviour for assignments related to 
lists and dictionaries than those related to symbolic variables?

Example:

sage: L1=[1,2,3];L2=[3,4,5]
sage: L=[L1,L2]
sage: L
[[1, 2, 3], [3, 4, 5]]
sage: LL=L
sage: LL[1]=0
sage: LL
[[1, 2, 3], 0]
sage: L
[[1, 2, 3], 0]
sage: LL=3
sage: L
[[1, 2, 3], 0]
sage: LL
3

After setting LL=L, any changes to elements in LL lead to similar 
changes in L, but if I change LL as a whole, the association between LL 
and L breaks down.

For symbolic variables LL=L does not lead to a link between the two:

sage: L=1
sage: LL=L
sage: LL
1
sage: L=2
sage: LL
1
sage: L
2

The retrospective links between lists can get really confusing:

sage: L1=[1,2,3];L2=[3,4,5]
sage: L=[L1,L2]
sage: L
[[1, 2, 3], [3, 4, 5]]
sage: L1[0]=99
sage: L
[[99, 2, 3], [3, 4, 5]]
sage: L[0][1]=88
sage: L
[[99, 88, 3], [3, 4, 5]]
sage: L1
[99, 88, 3]

If I construct a list out of two other lists, I usually don't expect the 
original lists to change if I manipulate the resulting list.
How can I break such links? Why does LL=L mean that L=LL for lists and 
dictionaries but not for variables? What is the use of it anyway?? I'm 
really confused now.

The retrospective link does not work if I use any operators such as 
L=L1+L2 or L=2*L1.

Thanks for pointing me to this!

Cheers
Stan

Justin C. Walker wrote:
> Hi, Stan,
>
> On Nov 4, 2008, at 00:47 , Stan Schymanski wrote:
>
>   
>> Sorry, I should have looked around a bit more. If I replace pars1 =  
>> pars
>> by pars1 = pars.copy() in the below code, the two dictionaries are
>> independent.
>>     
>
>
> You found part of the story, but there's a bit more.  Consider this  
> example:
>
> sage: L1=[1,2,3];L2=[3,4,5]
> sage: L=[L1,L2]
> sage: L3=[6,7,8]
> sage: LL=copy(L)
> sage: LL[1]=L3
> sage: L
>   [[1, 2, 3], [3, 4, 5]]
> sage: LL
>   [[1, 2, 3], [6, 7, 8]]
> sage: LL[0][1]=17
> sage: LL
>   [[1, 17, 3], [6, 7, 8]]
> sage: L
>   [[1, 17, 3], [3, 4, 5]]
>
> In your example, only the dictionary associations are copied.  If one  
> of the values (or keys, FWIW) in one of the entries had deeper  
> structure, that would not get copied (only a pointer would be copied).
>
> 'copy()' just copies the "first level"; if you want a copy of the  
> entire object, you need to use 'deepcopy()'.
>
> HTH
>
> Justin
>
> --
> Justin C. Walker, Curmudgeon at Large
> Institute for the Absorption of Federal Funds
> -----------
> Like the ski resort full of girls hunting for husbands
> and husbands hunting for girls, the situation is not
> as symmetrical as it might seem.
>    - Alan MacKay
> --
>
>
> >
>   



--~--~---------~--~----~------------~-------~--~----~
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/sage-support
URLs: http://www.sagemath.org
-~----------~----~----~----~------~----~------~--~---

Reply via email to