This is simply how the semantics of arrays are defined in Pike. An array has an invariant size, just as a string has invariant contents. []= modifies an array destructively, but other array operations (such as +) create new arrays instead. As an optimization, the array can be resized in place _if no other references exist_, but semantically there is always a new array created.
Example:
array z = ({ 17, 42 });
foo(z);
void foo(array x){ x[0]++; // z[0] becomes 18 x += ({ 3 }); // `+ generates a new array ({ 18, 42, 3 }) and // a reference to this array is stored in x x[1]++; // x[1] becomes 43, but z is still ({ 18, 42 }) }
As for the _reason_ why arrays have these semantics, I expect it's because of this: When an array grows, it might be necessary to allocate new memory for it. Since references are pointers to the data, reallocating an array which has references would mean having to find all those references and update them, which would take a lot of time.