In other languages this is less of an issue, because function signatures can include information about whether the argument can be modified or not. For example, in C++:
// Definitely doesn't modify 'array', because 'array' is copied.
vector<int> Normalize(vector<int> array);
// Almost certainly doesn't modify 'array'.
vector<int> Normalize(const vector<int>& array);
// Probably *does* modify 'array' (otherwise author would have used
// const reference instead of pointer.)
void Normalize(vector<int>* array);
In Python every function uses the 3rd approach, so you have to signal to the user in some other way whether the argument will be modified or not. In Ruby and some other languages the convention is to append "!" to the function name, but in Python most people seem to just mention it in the docstring.