코딩을 할 때 가끔 변수 설정으로 골머리를 앓곤 합니다. 이것저것 막 설정하다가 정신을 차리면 분명히 하나만 바꿨는데 다른 것도 같이 바뀌어있고, 이걸 가리키고 싶은데 다시 입력하려니 귀찮고. 이번 포스팅에서는 copy와 reference 개념을 통해 효과적인 변수 설정에 대해 알아보겠습니다.
오늘의 주인공은 리스트 두 개입니다. 먼저 리스트 하나를 먼저 설정해주겠습니다.
list_original = [1, 2, 3, 4, 5]
list_original 과 똑같은 리스트를 하나 더 만들고 싶은데요. =을 활용해 바로 똑같이 만들어주겠습니다.
list_same_as_original = list_original
확인해볼까요?
list_same_as_original
☞ [1, 2, 3, 4, 5]
바라던 대로 잘 설정했습니다. 그런데 두 번째 리스트의 1을 10으로 바꾸고 싶네요. 한 번 바꿔볼까요?
list_same_as_original[0] = 10
☞ [10, 2, 3, 4, 5]
이 정도는 참 쉽습니다. 그러면 추가 작업 전에 원래 리스트도 확인해 볼까요?
list_original
☞ [10, 2, 3, 4, 5]
두 번째 리스트만 바꾸고 싶었는데 첫 번째 리스트까지 통째로 바뀌어버렸습니다. 이런! 이렇게 리스트에 5가지 숫자만 있는 경우 한 번 더 써주면 되겠지만, 만약 숫자가 50,000개 있다면 그걸 처음부터 다시 입력하는 건 미친 짓임이 틀림없습니다. 그러면 완전히 똑같은 리스트를 만들되 두 가지를 각각의 다른 리스트로 만들어볼까요?
다시 리스트를 만들어주겠습니다.
genuine_list = [1, 2, 3, 4, 5]
genuine_list와 완전히 똑같지만 아예 다른 리스트 list_copy를 만들어 볼까요? 이 때 사용할 수 있는 것이 copy 기능입니다. 코드로 쓸 때는
= (변수명).copy() 입니다. 바로 복사해보겠습니다.
list_copy = genuine_list.copy()list_copy
☞ [1, 2, 3, 4, 5]
네, 우선 내용물은 똑같습니다. 그러면 마찬가지로 1을 10으로 바꿔보고 원래 리스트에 영향을 미치는지 확인해보겠습니다.
list_copy[0] = 10
print(list_copy)
print(genuine_list)
☞ [10, 2, 3, 4, 5]
☞ [1, 2, 3, 4, 5]
바로 이것, 원하던대로 입니다.
맨 처음과 아래의 차이는 무엇일까요? =을 썼는지, .copy()를 썼는지에 따라 다른 결과가 나왔습니다. 정리해 보겠습니다.
Reference는 같은 것을 ‘참조’하게 만드는 기능입니다.
반면 Copy는 같은 것을 ‘복사’하는 기능입니다.
첫 번째의 경우 list_original과 list_same_as_original이 같은 것을 가리키고 있으니 하나만 바꿔도 통째로 바뀌었던 것이고,
두 번째의 경우 genuine_list와 list_copy는 같아보이지만 사실 genuine_list를 복사해서 두 가지 리스트가 분리되어 있었기 때문에 하나만 바꿔줄 수 있었던 것입니다.
간단하게 숫자 몇 개를 활용해 Reference와 Copy의 차이를 직관적으로 알아보았습니다. 두 개념은 아주 간단하고 기초적이지만, 잘 정리해두지 않으면 개수가 매우 많은 변수들 여러 개를 다룰 때 큰 혼란을 초래할 수 있습니다.
Reference와 Copy와 함께라면, 두려울 게 없습니다.
감사합니다.
Clap과 댓글은 언제나 큰 힘이 됩니다.