Kevin Buzzard wrote:
> I finally took the plunge and started learning python. I think it's the
> first language I've ever learnt where "everything is a pointer" and it was
> a big psychological shock! After my first day of messing around with it, I
> was utterly confused :-) I had a vector which I wanted to modify several
> times, and I wanted to keep track of what the vector looked like at
> various stages, so I initiated a list and then wrote a loop which, on
> every iteration, modified the vector and then appended the modified vector
> to the end of the list. Of course, when the loop had ended, the list
> contained 100 copies of the final state of the vector. I had no idea what
> to do! I asked David Loeffler and he told me about loading various modules
> and using functions like deepcopy() and it all left me feeling wholly
> bewildered! On the other hand I am kind of coming around to the idea now.

Here's the sort of thing you might want to do:

sage: v = vector(ZZ, 5)
sage: w = [v]
sage: for i in range(10):
....:     z = copy(w[-1]); z[0] += 1; w.append(z)
....:
sage: w
[(0, 0, 0, 0, 0),
 (1, 0, 0, 0, 0),
 (2, 0, 0, 0, 0),
 (3, 0, 0, 0, 0),
 (4, 0, 0, 0, 0),
 (5, 0, 0, 0, 0),
 (6, 0, 0, 0, 0),
 (7, 0, 0, 0, 0),
 (8, 0, 0, 0, 0),
 (9, 0, 0, 0, 0),
 (10, 0, 0, 0, 0)]


This is indeed totally different than Magma which uses call by value
semantics.  Python is much closer semantically to C/C++, where most serious
programs pass around pointers.

In Magma:

> v := VectorSpace(RationalField(), 5)!0;
> w := [v,v,v];
> v[1] := 5;
> w;
[
    (0 0 0 0 0),
    (0 0 0 0 0),
    (0 0 0 0 0)
]

In Sage/Python:

sage: v = vector(ZZ, 5)
sage: w = [v,v,v]
sage: v[1] = 5
sage: w
[(0, 5, 0, 0, 0), (0, 5, 0, 0, 0), (0, 5, 0, 0, 0)]

In Python w = [v,v,v] makes a list with 3 references to a single object.
In Magma it *tends* to make a list of 3 copies, if copying of objects
happens to be defined -- otherwise magma *still* makes a list of
3 references !!

> v := ModularSymbols(389);
> w := [v,v,v];
> v`dimension := 10;
> w[2]`dimension;
10

So Magma is just plain inconsistent, which in the long run is
more confusing than Python.  This is especially relevant when
it comes to complicated data structures (common in mathematics)
where copying is just not defined or is very expensive.


By the way the copy Python function is usually enough to copy
most Sage objects sufficiently for most purposes.   Deep copy
is needed only in certain special cases, e.g., a list of lists...

-- 
William Stein
Associate Professor of Mathematics
University of Washington
http://wstein.org

--~--~---------~--~----~------------~-------~--~----~
To post to this group, send email to sage-support@googlegroups.com
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://sage.math.washington.edu/sage/ and http://sage.scipy.org/sage/
-~----------~----~----~----~------~----~------~--~---

Reply via email to