Hi,
I tired to explan it in storage view. I used .data_ptr() to check whether tensors have the same storage.
In the first case, a.data_ptr() == a[:,:].data_ptr(), so they share the same storage, value changing will also perform on original a.
In the second case, a.data_ptr() != a[:, (0,1,2)].data_ptr(), they donot use the same base.
Im not sure whether it is a proper way to explan it, your use case may related to indexing operations, i will google it further. If I am wrong, correct me please.
EDIT:  here 140 is the answer.