C++로 공부를 하다가 python으로 넘어오니 헷갈리는 부분이 많아진다.
메모리 구조는 어떤지(데이터, 스택 힙 등), 포인터없이 어떤 꼴로 class를 만드는 건지? C언어로 처음에 만들었다고 했으니까 C++ 에서의iterator(?) 형식으로 하는건지? 동적 할당 개념? 가비지 콜렉터? 함수 호출은 스택 형식이 아닌가? call by는 어떤지 등 C++도 완벽하지 않은 상태에서 다시 python으로 공부를 하려니 혼란스러워 지는 부분이 많은 것 같다.
그래서 맨 처음에는 data type을 정리해야 call by, 파이썬에서 객체 개념 등 더 들어가면서 공부를 할 수 있을 것 같다.
int a = 1;
double b = 1.0;
char c ='a';
# python
a = 1
b = 1.0
c = 'asdf'
python은 데이터 타입을 지정해주지 않아도 된다. 파이썬은 C처럼 compile해서 구동하는 방식이 아니고 한 줄 한 줄씩 진행하는 인터프리터형 언어라서 그때 그때 맞는 데이터 변수 타입을 찾는다고 보면 된다.
완전 편한 것 같긴하지만, 문제도 있고 그 문제에 따른 대안도 있다.
[C같은 경우]
int a =3;
int b = 4;
printf("%d", a/b); // 0
a =3
b = 4
print(a/b) # 0.75 실수형이 출력
print(a//b) # 0이하 부분은 버리고 정수형으로 출력
C++에서는 ADT를 쓰기 위해 STL을 이용을 했는데 파이썬에서는 내부적으로 제공한다.
알고리즘 문제를 푸는데 list를 많이 이용하게 되었다. 그런데 list를 쓰면서 시간복잡도를 생각하는데, C++에서 vector랑 달리 list는 node 형식이라서 random access가 없고 있더라도 O(n)을 가질 줄 알았는데 아니었다.
그래서 list의 내부 구조가 궁금하였고, 파이썬 리스트 내부 구조를 구글에서 검색하다가 우연히 친구가 작성한 블로그를 확인하였다.(링크
친구가 작성한 글도 읽고 공식문서도 어렵지만은 읽어보려고 노력하였다. 공식문서에서는 list는 오히려 C++에서 vector와 비슷하게 동작한다고 적혀있었고, 이중 포인터를 이용했기 때문에 vector처럼 임의 접근이 가능하였고, 서로 다른 데이터 형식을 넣을 수도 있었던 것이다.
리스트를 어떻게 쓰는지 딕셔너리를 어떻게 쓰는지 집합을 어떻게 쓰는지에 등 간단한 사용과 개념에 대한 부분은 빠르게 학습을 할 수 있는 영역이다. 그런 공부만으로는 깊이가 조금은 부족할 수 있다. 친구에게 조언을 얻었는데 파이썬 공식문서를 이해하는 것을 목표로 공부할 수 있으면 된다고 한다.
공식문서 처음 볼 때는 매우 어려운데 그 공식문서를 이해하기 위해 여러 검색과 공부를 하면서 실력이 더 느는 것을 느낄 수 있다고 한다. 지금 당장은 이외에도 공부해야할 내용이 많아서 공식문서를 이해하기 위한 공부는 무리 일 수 있지만, 장기적인 방향설정을 할 수 있었다.
mutable vs immutable / iterable vs not iterable