파이썬에서 다루는 List는 조금 특별합니다. 다음은 list의 특징입니다.
여기서 원소(elements)란 무엇일까요.
문자열(String)에서도 나왔었는데, 원소라는 건 일종의 구성요소입니다. 문자열의 원소가 문자였던 것처럼 말입니다.
아래는 공식 문서에서 설명하는 list입니다.
Lists are mutable sequences, typically used to store collections of homogeneous items (where the precise degree of similarity will vary by application).
지금부터 list에 대해 알아보도록 하겠습니다.
List는 수정이 가능한 sequence입니다. 여러 sequence 중 수정이 가능한 건 list가 유일합니다.
list의 가장 기본적인 표현은 다음과 같이 대괄호"[ ]"로 나타냅니다. 내부 원소는 쉼표로 구분합니다.
또는 list( ) 내장함수(built-in function)를 이용하는 방법도 있습니다.
보통은 리스트(list)가 아닌 대상을 리스트(list)로 만들 때 사용합니다. 대상은 iterable인데, 여기서 배우는 sequence types는 전부 iterable입니다.
요약+
이미 위에서 보았듯이, 리스트도 인덱싱과 슬라이싱이 가능합니다.
문자열에서 했던 것과 굉장히 비슷한데, 다른 점이라면 슬라이싱을 했을 때 리스트(list)가 나온다는 점뿐인 것 같습니다.
list는 직접 원소를 수정하는 게 가능합니다.
사진을 보시면 원래 drinks 리스트의 0번째 원소는 "milk"였습니다.
drinks[0] = "water" # drinks의 0번째 인덱스의 원소를 "water"로 지정하다
이후 인덱싱 표현을 통해 "water"로 바꾼 것을 보실 수가 있습니다.
그렇다면 슬라이싱으로 하면 어떤 결과가 나타날까요?
0번째부터 2번째 전까지를 "coke"로 바꾸었습니다. 물론 꼭 한 개로 바꿀 수만 있는 것은 아닙니다.
같은 수의 원소를 가진 리스트도 가능하고,
더 많은 원소를 가진 리스트도 가능합니다.
원소가 하나도 없으면 "빈 리스트"라고 하는 데요, 이걸 활용하면 삭제도 가능할 것 같습니다.
그런데 리스트(list)가 아닌 문자열(string)을 입력한 경우에는 어떻게 될까요?
string type의 "coke"로 지정을 했더니 "coke"의 문자 하나하나가 모두 drinks의 원소가 되는 모습을 볼 수 있습니다.
수식의 의미는 다음가 같았던 것입니다.
drinks[0:2] = ['c', 'o', 'k', 'e']
위에서 본 list( ) 함수로 "coke"를 바꾸어보니 실제로 다음과 같이 나오네요.
List 또한 string처럼 연산이 가능합니다.
두 리스트의 원소를 모두 포함하는 새로운 리스트를 만들어냅니다.
내부 원소를 곱한 횟수만큼 반복하는 새로운 리스트를 만들어냅니다.
두 경우 모두 string types를 배울 때와 유사합니다.
+추가로 list에서는 꽤 자주 사용하는 내장함수(built-in function)이 있습니다.
len( ) 함수는 리스트(list)뿐만 아니라 모든 sequence types와 string types의 길이를 구해줍니다. 원소의 개수라고 볼 수 있겠네요.
얕은 복사와 깊은 복사는 리스트를 복사할 때 중요한 개념입니다. 심화적인 개념보다는 간단하게 설명해보도록 하겠습니다.
경험적으로 알아보았던 "=" 기호는 지정문(assignment statement)를 만드는 데 사용합니다.
먼저 a에 [1, 2, 3]을 지정했습니다.
그런 다음 b에 a를 지정합니다. 통상적으로는 a가 가진 값을 지정합니다.
그런데 사실 이건 틀렸습니다. b는 a가 가리키고 있던 대상과 똑같이 생긴 다른 대상을 가리키는 것이 아닙니다.
다만 b는 a가 가리키는 대상과 같은 대상을 가리키는 것입니다.
예시를 하나 봅시다.
실제로 b에 접근하여 수정한 적은 없지만, b가 변한 것을 볼 수 있습니다.
위와 같이 b에 a를 지정하는 경우를 '얕은 복사'라고 합니다. 보기에는 b에 a의 내용을 복사한 것처럼 보이지만 실상은 a가 가리키는 대상을 b도 함께 가리키는 경우입니다.
그렇다면 이와 반대되는 '깊은 복사'는 저희가 원하는 진짜 복사입니다.
이렇게 하는 방법 중 가장 간단한 방법은 슬라이싱을 활용하는 방법입니다.
슬라이싱은 내부 원소를 모두 복사해서, 원래 대상과 같은 data type의 데이터를 줍니다.
a = [1, 2, 3]
b = a[:]
위의 경우엔 list type의 데이터를 슬라이싱했으므로 위의 코드는 아래와 같습니다.
a = [1, 2, 3]
b = [1, 2, 3]
String때와 마찬가지로 꼭 한 번씩 따라서 입력해보시기를 바랍니다
참고:
https://docs.python.org/3/index.html
https://wikidocs.net/14#del
https://wikidocs.net/14#_11
프로그래밍의 정석: 파이썬 - 도경구