Thanks everyone for the explanation, which more or less clears up the functional 'why' of my question.
But I'm still a little confused. Tom, when you say 'pass-by-reference instead of pass-by-value', is that a property of the thing being passed, rather than the language itself?
I tried e.g. this:
x = 0; // or true/false/whatever value
y = Array.fill(8, x);
x = 1;
y.postln;// == [0,0,0,0,0,0,0]
but if I do:
x = [0];
y = Array.fill(8, x);
x[0] = 1;
y.postln; // == [[1],[1],[1],[1],[1],[1],[1],[1]];
So is it correct to understand that arrays are passed as a reference to the array, but unary value variables as the value of the variable? And if so, is there a reason for that?