Indeed, objects are passed by reference, but a = a[:2]basically creates a new local variable that points to a list fragment.
To modify a list object, you can assign it to its slice (slice assignment).
Consider aand bis equivalent to your global band local a, is the assignment of aa new object has no effect on b:
>>> a = b = [1, 2, 3]
>>> a = a[:2]
>>> a, b
([1, 2], [1, 2, 3])
>>> id(a), id(b)
(4370921480, 4369473992)
The slice assignment works as expected:
>>> a = b = [1, 2, 3]
>>> a[:] = a[:2]
>>> a, b
([1, 2], [1, 2])
>>> id(a), id(b)
(4370940488, 4370940488)
: slice, ?