# [Numpy-discussion] Re: Trying out Numeric3

Scott Gilbert xscottg at yahoo.com
Fri Mar 25 23:16:08 CST 2005

```--- Stephen Walton <stephen.walton at csun.edu> wrote:
> Travis Oliphant wrote:
>
> > Well, rank-0 arrays are and forever will be mutable.  But, Python
> > scalars (and the new Array-like Scalars) are not mutable.
>
> This is a really minor point, and only slightly relevant to the
> discussion, and perhaps I'm just revealing my Python ignorance again,
> but:  what does it mean for a scalar to be mutable?  I can understand
> that one wants a[0]=7 to be allowed when a is a rank-0 array, and I also
> understand that str[k]='b' where str is a string is not allowed because
> strings are immutable.  But if I type "b=7" followed by "b=3", do I
> really care whether the 3 gets stuck in the same memory location
> previously occupied by the 7 (mutable) or the symbol b points to a new
> location containing a 3 (immutable)?  What are some circumstances where
> this might matter?
>

It's nice because it fits with the rest of the array semantics and creates
a consistant system:

Array3D = zeros((1, 1, 1))

Array2D = Array3D[0]
Array1D = Array2D[0]
Array0D = Array1D[0]

That each is mutable is shown by:

Array3D[0, 0, 0] = 1
Array2D[0, 0] = 1
Array1D[0] = 1
Array0D[] = 1 # whoops!

Unfortunately that last one, while it follows the pattern, doesn't work for
Python's parser so you're stuck with:

Array0D[()] = 1

This becomes useful when you start writing generic routines that want to
work with *any* dimensional arrays:

zero_all_elements(ArrayND)

Python's immutable scalar types could not change in this case.  More
complicated examples are more interesting, but a simple implementation of
the above would be:

def zero_all_elements(any):
any[...] = 0

Cheers,
-Scott

```