파이썬으로 데이터 좀 만지다가 진짜 어이없는 버그 때문에 한참 헤맸어요. 리스트를 복사해서 새 변수에 넣고 그걸 수정했는데 원본까지 같이 바뀌더라고요. 복사를 했는데 왜 원본이 건드려지는 거죠?
처음엔 이렇게 했어요.
a = [[1, 2], [3, 4]]
b = a
b[0][0] = 99
print(a) # [[99, 2], [3, 4]] ???
이건 그냥 같은 걸 가리켜서 그렇다는 걸 알아서 slice로 바꿨거든요.
b = a[:]
b[0][0] = 99
print(a) # 근데 또 [[99, 2], [3, 4]]
바깥 리스트는 분명 복사됐는데 안쪽 리스트는 여전히 같이 바뀌어요. 이게 도저히 이해가 안 갑니다. 분명 복사했는데요?
찾아보니 copy랑 deepcopy라는 게 있던데, 얕은 복사 깊은 복사 이런 용어만 나오고 정작 뭐가 다른지는 감이 안 와요. 얕은 게 뭐고 깊은 게 뭔지, 언제 그냥 copy 쓰고 언제 deepcopy 써야 하는지 좀 알려주세요. 매번 deepcopy 쓰면 안전한 거면 그냥 그거만 쓰면 되나요?