저번 글에서 살펴봤던 숫자형, 문자열 자료형에 이어 이번에는 리스트 자료형부터 한 번 살펴보자.
숫자와 문자열은 유감스럽지만 전부 하나의 내용만을 담고 있다. 여러개의 내용을 개별적으로 담아주기에는 무리가 있는 자료형들이다. 그래서 등장한 것이 바로 리스트 자료형이다.
odd = [1,3,5,7,9]
a= [1, 2, "Life", 4]
e= ["kim", "lee", "park"]
이런 식으로 대괄호 안에 숫자든 문자열이든 다른 리스트든 상관없이 다 들어올 수 있다.
리스트도 역시 인덱스를 사용하는데 문자열과 인덱스의 구조가 똑같으니 이전 글을 참고하자.
슬라이싱도 마찬가지다.
리스트의 연산도 마찬가지다.
더하기로 두 개의 리스트의 원소들을 합칠 수도 있고, 곱하기로 리스트의 원소들을 반복할 수도 있다.
리스트 자료형은 수정과 삭제가 매우 용이한 자료형이다.
a=[1,2,3]
a[2]=4
// a=[1,2,4]
del a[1]
// a=[1,4]
인덱스를 활용해서 값을 변경해줄 수 있다.
del을 활용하여 지정한 인덱스의 원소를 삭제해주는 것도 가능하다.
물론 하나가 아니라 [2:] 처럼 슬라이싱 규칙을 따라서 여러 개도 삭제가 가능하다.
리스트 관련 함수들도 정말 많은데 대표적인 것 몇개만 써놓고 자세한 내용은 구글링해보자.
아마 이름 보면 어떤 건지 느낌이 온다.
.append
.sort
.reverse
.index
.insert
.remove
.pop
.count
.extend
다음 살펴볼 자료형은 튜플이다. 자바스크립트에서는 없는 자료형인데 아마 다른 많은 언어들은 가지고 있는 걸로 알고 있다.
튜플은 리스트는 리스트인데 아주 고정적인 리스트이다.
a=(1,2,3)
b=('a','b')
이런식으로 소괄호로 묶어서 활용되는데 다만 튜플은 안의 원소의 값들을 변경할 수 없다.
리스트는 그 안에서 인덱스로 추가 및 삭제, 내장함수 활용으로 변경이 마구잡이로 가능하지만 튜플은 그랬다가는 바로 에러만 보게 될 것이다.
다음 살펴볼 자료형은 딕셔너리 자료형이다.
말 그대로 딕셔너리, 즉 사전과 같은 구조로 되어있는 자료형이다. 사전을 보면 apple의 뜻이 사과인 것처럼 어떤 key 값과 value 값을 매칭해놓은 자료형이 바로 딕셔너리이다.
dic = {'name':'key','phone':"010-0000-1234", "birth" : "0229"}
이런 식으로 중괄호 안에 name, phone, birth라는 key 값에 "key", "010-0000-1234", "0229"와 같은 문자열 value가 짝을 이루고 있는 것이다.
딕셔너리의 쌍을 추가, 삭제하는 법은 리스트와 매우 유사하다.
a={1:'a'}
a[2]='b'
// a = {1:'a',2:'b'}
del a[1]
// a = {2:'b'}
아주 살짝 다른 점은 리스트에서는 인덱스를 활용했지만 여기서는 key 값을 활용해서 추가, 삭제를 한다.
딕셔너리 안에 값을 읽고 싶다면 key값을 불러오면 된다.
이 key 값은 결국 개별적인 자료들을 구별하는 중요한 요소이기 때문에 key값을 중복해서 사용하는 일은 없도록 하자.
관련 함수는 얘도 여러 개가 있다.
단, 딕셔너리 관련 함수에 대해서 나중에 혼자 찾아볼 때 리턴값이 어떤 자료형을 가지는지는 유심히 볼 필요가 있다.
.keys
.values
.items
.clear
.get
.in
.
.
.
다음으로 살펴볼 자료형은 집합 자료형이다.
중고등학교 때 수학 시간에 나오는 그 집합이랑 똑같다고 생각하면 된다. 집합의 가장 큰 특징은 순서가 없는 것이다. 그렇기 때문에 인덱스도 없다.
집합은 위에서 살펴봤던 자료형들과는 다르게 set이라는 키워드를 통해서 만들어야한다.
s1 = set([0,1,2])
// {0,1,2}
s2 = set("Hello")
// {'H','e','l','o'}
두번째 set을 보면 뭔가 이상하다. 'l'이 분명 2개였는데 set에서는 하나 밖에 없다.
set 자료형의 두번째 중요한 특징이다.
중복되는 것이 없다.
그래서 중복되는 값들을 정리해주고 싶을 때 set 자료형을 많이 활용한다.
집합을 배웠으니 교집합, 합집합, 차집합이 있는 건 당연한 수순이다.
교집합(&) or .intersection
합집합( | ) or .union
차집합( - ) or .difference
기호를 활용해서 연산을 할 수도 있고 내장함수를 통해서 연산을 할 수도 있다.
관련 함수로는 다른 자료형들에 비해 간단하다. 순서가 없고 중복이 없기 때문이다.
.add
.update
.remove
.
.
.
다음 살펴볼 자료형은 불 자료형이다. 아마 프로그래밍이 처음이라면 불 자료형이 왜 있어야되는지 잘 모르겠는 사람들도 있을 것이다.
일단 결론은 불은 논리적인 참과 거짓인 True, False만 존재하는 자료형이다.
불 자료형은 조건문,반복문에서 참, 거짓을 판별할 때 필수적으로 활용된다고 보면 되고
또한 자료형의 참과 거짓도 구별이 가능하다.
비어있는 문자열, 리스트, 튜플, 딕셔너리, 그리고 숫자 0은 모두 False로 간주된다.
비어있는지 아닌지도 불 자료형을 통해 판별이 가능하다.
다음으로 살펴볼 건 자료형은 아니고 변수이다.
결국 어떤 자료형의 값을 변수에 담아서 프로그래밍을 하게 될 텐데 변수에 대한 이해를 해야 좀 더 매커니즘을 잘 이해할 수 있다.
변수는 = 을 통해서 값을 할당한다.
C나 JAVA의 경우 변수를 만들 때 변수명과 함께 자료형의 타입을 직접 지정해야 한다.
하지만 파이썬은 동적 타이핑 언어이기 때문에 저장된 값을 보고 어떤 자료형의 타입인지 알아서 지정된다.
일단 변수를 어떻게 만드는지는 알겠는데 그렇다면 변수라는 애들 어떤 것일까?
변수는 객체를 가리키는 것이라고 할 수 있고 여기서의 객체는 지금까지 봤던 자료형의 데이터(값)와 같은 것을 의미하는 말이다.
변수를 선언하면 어떤 일이 벌어질까?
a = 1
이렇게 간단한 코드 한 줄에서 어떻게 변수가 할당되는지 가볍게 이해해보자.
먼저 변수는 값 그 자체가 아니다. 1이라는 값을 지정하는 식별자이다.
컴퓨터 메모리의 구조에 대해서 조금이라도 알고 있다면 메모리의 주소에 대해서 들어본 적이 있을 것이다.
위의 코드가 실행되면 1이라는 값이 메모리에 저장되게 되고 a는 그 1이라는 값이 저장된 메모리의 주소를 가리키게 된다.
그래서 print(a)를 하게 되면 a 값이 가리키는 주소로 가서 그 주소에 있는 값을 불러와서 1을 print하게 된다.
그 저장된 주소값은 파이썬 내에서 id라는 함수를 통해서 찾을 수 있다.
이 개념이 조금 더 응용될 때 많이들 헷갈리는 것이 바로 리스트의 복사이다.
a=[1,2,3]
b=a
a[1]=4
// a=[1,4,3] b는 무슨 값을 가질까?
2번째 줄 코드의 의미는 a의 메모리 주소를 b에 대입했다는 것과 똑같은 말이다. 실제로 id를 출력해도 같은 값을 나타낸다.
이 때 a[1]=4를 하면 a의 리스트가 변경되는 것은 이해가 된다. 그렇다면 b는 어떤 값을 가질까?
답은 b = [1,4,3]이다.
b는 건드리지도 않았는데 왜 2번째 값이 변경되었을까?
위에서도 말했다시피 a와 b의 메모리 주소는 같다. 즉, a를 통해 해당 메모리 주소의 값이 변경되었다면 b는 주소가 똑같기 때문에 같은 메모리를 참조하게 되어 바뀐 값을 읽어올 수 밖에 없다.
그렇다면 리스트를 복사하고 싶다면 어떻게 해야될까?
// 슬라이싱
a=[1,2,3]
b=[:]
// copy 모듈 이용하기
from copy import copy
a=[1,2,3]
b=copy(a)
그렇다면 만약 이렇게 해서 만든 b가 a랑 똑같냐고 물어보면 어떻게 답을 해야될까?
아마 컴퓨터가 대답을 대신 해줄 것이다. 이건 False다.
데이터의 값은 똑같지만 서로 주소가 다르다. 같은 스크류바를 가지고 있다고 할 때 한 놈은 씨유에서 사고 한 놈은 세븐일레븐에서 샀기 때문에 내용물은 같을지 몰라도 엄밀히 말하면 둘이 완전히 똑같은 거는 아니다.
변수 할당이 메모리에서 어떻게 이루어지는 이해하는 것은 파이썬뿐만 아니라 다른 언어에서도 꼭 알아야하는 개념이기에 꼭 이해하고 넘어가면 좋을 것 같다.
'Python' 카테고리의 다른 글
Python 스터디 5장 - 파이썬 날개 달기 (1) (0) | 2023.06.30 |
---|---|
Python 스터디 4장 - 파이썬의 입출력 (0) | 2023.06.27 |
Python 스터디 3장 - 프로그램의 구조를 쌓는다! 제어문 (0) | 2023.06.26 |
Python 스터디 2장 - 파이썬 프로그래밍의 기초, 자료형 (1) (0) | 2023.06.25 |
Python 스터디 1장 - 파이썬이란 무엇인가? (0) | 2023.06.21 |