평소 Python에서 당연하게 리스트를 사용했던터라
이 부분에 대해 확실하게 한번 짚고 넘어가야 겠다고 생각했다.
배열
이다.배열은 메모리에서 생성될 때 항상 크기가 주어진다.
즉, 배열이 담을 수 있는 아이템들의 개수는 선언한 만큼으로 정해져 있고
컴퓨터는 해당 배열을 위한 공간을 메모리에 할당해준다.
이때, 할당된 메모리 공간은 연속적
이라는 특징이 있다.
(각 아이템은 인덱스를 갖는다.)
배열은 위와 같이 연속된 박스의 나열이다.
모든 아이템들이 서로 옆에 배치되고, 같은 크기를 갖기 때문에 첫번째 아이템의 위치를 알고 있다면, 다른 아이템들의 위치도 계산할 수 있다.
Ex. 첫 아이템의 메모리 위치가 00이고 사이즈가 24바이트 일때,
바로 다음 아이템은 00 + 24 = 24에 위치하게 되는 격이다.
또, 그 다음 아이템은 24 + 24 = 48이며, 이런 식으로 계속 된다.
배열에 위치한 어떠한 아이템의 메모리 위치도 쉽게 계산할 수 있으며
아이템에 인덱스를 할당할 수 있고, 인덱스를 활용하여 쉽고 직접적으로 아이템에 접근할 수 있다.
길이를 바꾸기 위해서는 기존의 배열은 그대로 두고
새로운 길이로 배열을 다시 하나 만들고
기존 배열에서 데이터를 복사한 뒤 기존의 배열을 삭제해야한다.
이를 해결하기 위해서 linked list
를 활용할 수 있다.
삭제한 데이터를 뒤에 위치한 요소로 체우면 데이터 순서에 따라 빈틈없이 연속적으로 위치하는 List가 된다.
즉, List의 경우 삭제된 데이터의 빈 공간을 채운다는 특징이 있다.
ㄱ | ㄴ | ㄷ | ㅁ |
---|
ㄱ | ㄴ | ㄷ | ㅁ |
---|
└ 배열보다 더 메모리를 효율적으로 사용할 수 있다.
순서
이고, 리스트를 다른 말로 시퀀스(sequence)라고 부른다. 즉, 순서가 있는 데이터의 모임
이다.하나의 아이템이 다음 아이템을 포인팅하는 Linked List
가 있다.
하지만, 각 아이템들은 메모리 상에서 모두 흩어져 있을 수도 있다.
이 경우에는 첫번째 아이템의 주소를 알아도 다음 아이템의 메모리 주소를 간단히 게산할 수 없다는 것을 의미한다.
결국, 리스트는 배열처럼 아이템에 직접 접근하기 위해 인덱스를 사용할 수 없다.
그런데,,
위에서는 List에서 인덱스를 가지지 않는다고 하였는데
파이썬은 리스트를 선언하여 인덱스를 활용하여 접근이 가능하다
lst = [1, 2, 3]
print(lst[0]) # 1
이는 단순한 용어의 혼동이다.
보통 컴퓨터 공학에서의 리스트는 위에서 말한 리스트를 의미하지만,
파이썬에서는 리스트라는 용어를 다르게 사용한다.
파이썬에서 리스트가 어떻게 작동하는지 내부를 들여다보면,
파이썬의 리스트는 배열처럼 구현이 되어 있다.
즉, 파이썬 리스트의 아이템들은 메모리 상의 연속적인 위치에 배치되며, 인덱스를 사용하여 접근이 가능하다.
Array와 List특징을 정리해보면서 생각해 본 것이다.
◽ 파이썬에서 리스트(배열)는 가변 길이를 가진다.
배열의 특징 중 길이는 고정이다.
요소를 하나 더 추가하고 싶다면 새로운 배열을 선언하여 복사하여 옮겨주는 작업이 필요하다.
하지만, 파이썬에서는 append를 활용하여 자유롭게 요소를 추가할 수 있다.
lst = [1, 2, 3]
lst.append(4)
print(lst) # [1, 2, 3, 4]
print(len(lst)) # 4
이렇게 append를 사용하여 손쉽게 요소를 추가할 수 있으며
추가한 뒤 길이는 늘어나게 된다.
배열의 경우 데이터를 중간에 삭제하게 되면 빈공간으로 남아서 메모리 낭비가 생긴다.
하지만, 파이썬에서는 append, pop으로 자유롭게 요소를 추가, 삭제할 수 있으며
삭제한 뒤에는 빈공간이 남지 않고 바로 다음에 위치한 요소로 자리가 채워진다.
lst = [1, 2, 3, 4]
lst.pop(2) # 3을 삭제
print(lst) # [1, 2, 4]
print(len(lst)) # 3
이런 위와 같은 특징 때문에 배열보다는 리스트라는 이름을 사용하는게 아닐까 싶다.
안녕하세요
리스트 공부를 하다 궁금증이 생겨 찾아보다가 방문하게 되었습니다.
질문이 하나있는데 만약에 리스트에 크기를 6으로 할당했는데 데이터 추가시에 뒤에 메모리가 사용중이면 메모리관점에서 리스트는 다시 할당이 되는건가요??