
메모리는 인간의 단기 기억에 비유된다.
메모리는 스토리지와 대조되는 개념으로, 쉽게 접근 가능하지만 영구적으로 저장되지 않는 저장 공간을 얘기한다. 메모리는 정보를 저장할 수 있는 일종의 긴 띠의 모양이다. 그리고 그 긴 띠에 몇 칸씩 정보가 저장되어 있다.
메모리에 저장된 정보에 접근하기 위해서는 주소가 필요하다.
가리키는 것이 같으면, 메모리 주소도 같다.
A = 9
B = 9
print(id(A) == id(B)) # True
A = 10
print(id(A) == id(B)) # False
많은 사람들이 오해하고 있는 지점이다.
변수 자체가 메모리를 차지한다고 생각하여 변수를 다르게 설정하는 것이 메모리를 낭비하는 것이라고 생각한다. 또 LEGB를 생각해서, '어차피 LEGB rule이 있으니까 메모리를 아낄 겸 같은 변수명을 써버리자' 라고 생각하기도 한다. 그러나 이것은 틀렸다.
변수를 다르게 지정해도, 가리키는 값이 같으면 주소는 같다. 즉 메모리를 재할당하지 않는다.
listA = [1, 2, 3]
listB = listA
print(id(listA) == id(listB)) # True
이렇게 listB는 shallow copy되어 listA (참조 데이터)가 저장한 메모리 주소 값을 복사하여 listA와 같은 주소를 가진다. listB를 수정하면 listA에 영향이 간다.
listA = [1, 2, 3]
listC = listA[:]
print(id(listA) == id(listC)) # False
deep copy는 shallow copy와 다르게 값을 복사하여 새로운 메모리 공간에 할당하는 것을 말한다. listC를 수정해도 listA에 영향이 가지 않는다. 그들은 다른 주소값을 가지고 있기 때문이다.