메모리 주소 복사인것으로 보입니다
s1의 경우 리스트를 그대로 곱해서 s[0], s[1], s[2]의 메모리값이 동일해 s[0]을 바꿔도 메모리가 가르키는 방향이 모두 동일해 s[1] 등도 값이 동일하게 변경되는 것입니다
c 배열에서 메모리 주소 복사에 대해 찾아보시는게 좋을것 같네요
얕은 복사, 깊은 복사의 개념을 검색해보시면 좋읍니다.
s1 선언시 [[0] * 3] 에 *3을 해서 0 3개있는 리스트가 고대로 복사가 되어버린 것입니다. 이 친구들은 같은 메모리 주소를 가리키는 이름만 다른 친구들 (s1[0] s1[1] s[2]) 이 되었다고 보면 됩니다.
이를 방지하려면 s1 = [[0] * 3 for _ in range(3)] 처럼 리스트 컴프리헨션 방식을 사용해주면 됩니다