본문 바로가기
알고리즘

Do it! 자료구조와 함께 배우는 알고리즘 입문 : 파이썬 편 - 02 기본 자료구조와 배열 요약

by 느림보어른 2021. 5. 24.

배열(array)

묶음 단위로 값을 저장하는 자료구조

원소(element): 배열에 저장된 객체 하나하나

인덱스(index): 각 원소는 0, 1, 2... 순으로 index를 부여받는다.

 

튜플(tuple)

원소에 순서를 매겨 결합한 것으로 원소를 변경할 수 없는 이뮤터블(immutable) 자료형이다.

원소를 쉼표로 구분하여 나열한 뒤 결합 연산자 ()로 둘러싸는 방식으로 생성한다.

원소가 1개인 경우 원소 뒤에 쉼표를 반드시 입력해야 한다. 쉼표가 없을 경우 단순 변수로 여긴다.

 

리스트(list)

원소를 변경할 수 있는 뮤터블(mutable) 자료형이다.

연산자 [] 안에 원소를 쉼표로 구분하여 표기하여 생성한다.

 

슬라이스(slice)

리스트 또는 튜플의 원소 일부를 연속해서 또는 일정한 간격으로 꺼내 새로운 리스트 또는 튜플을 만드는 것을 의미한다.

  • s [i:j] -> s [i]부터 s [j-1]까지 나열한다.
  • s [i:j:k] -> s [i]부터 s [j-1]까지 k씩 건너뛰며 나열한다.

위의 i, j 값은 다음의 규칙을 따른다.

  • i, j가 len(s) 보다 크면 len(s)가 지정된 것으로 간주한다. 즉, 인덱스 범위에서 벗어난 값을 지정해도 오류가 발생하지 않는다.
  • i가 없거나 None이면 0이 지정된 것으로 간주한다.
  • j가 없거나 None이면 len(s)가 지정된 것으로 간주한다.

i, j, k의 값 중에서 1개의 값 이상을 생략하는 패턴은 다음과 같이 정리할 수 있다.

패턴 설명
s[:] 리스트 s의 원소를 모두 출력합니다.
s[:n] 리스트 s의 원소 중 맨 앞에서부터 n개까지 출력합니다.
s[i:] 리스트 s의 원소 중 s[i]부터 맨 끝까지 출력합니다.
s[-m:] 리스트 s의 원소 중 맨 앞에서부터 k개씩 건너뛰며 출력합니다.
s[::k] 리스트 s의 원소 중 맨 앞에서부터 k개씩 건너뛰며 출력합니다.
s[::-1] 리스트 s의 원소 중 맨 끝에서부터 전부 출력합니다.

파이썬의 대입

  • 좌변에 변수 이름이 처음 나온 경우, 그 변수에 맞는 자료형으로 자동 선언해준다.
  • 대입식은 값 자체가 아니라 참조하는 객체의 식별 번호를 대입한다. 따라서 이미 선언된 변수에 새로운 값을 대입하면 값이 아니라 식별번호가 바뀐다.
  • 여러 변수에 여러 값을 한꺼번에 대입할 수 있다.
  • "="은 식(statement)이 아니라 문(expression)이다.

자료구조(data structure)

데이터 단위와 데이터 자체 사이의 물리적 또는 논리적 관계.

등가성과 동일성

파이썬에서는 값을 비교할 때 등가성(equality)과 동일성(identity)을 사용한다.

  • 등가성 비교는 ==을 사용하고 좌변과 우변의 값이 같은지 비교한다.
  • 동일성 비교는 is를 사용하고 값과 객체의 식별번호도 같은지 비교한다.

예를 들어

>>>lst1 = [1, 2, 3, 4, 5]
>>>lst2 = [1, 2, 3, 4, 5]

>>>lst1 == lst2
True

>>>lst1 is lst2
False

모듈(module)

파이썬에서 하나의 스크립트 프로그램.

확장자(. py)를 포함하지 않는 파일의 이름 자체를 모듈 이름으로 사용한다.

 

  • 스크립트 프로그램이 직접 실행될 때 변수 __name__은 '__main__'이다.
  • 스크립트 프로그램이 import 될 때 변수 __name__은 원래의 모듈 이름이다.

이터러블(iterable)

문자열, 리스트, 튜플, 집합, 딕셔너리 등의 자료형 객체는 모두 반복가능(이터러블)하다.

객체 참조에 의한 전달(call by object reference)

파이썬에서는 인수 전달은 실제 인수인 객체에 대한 참조를 값으로 전달하여 매개변수에 대입되는 방식을 취한다.

 

함수 사이의 인수 전달을 정리하면 다음과 같다.

함수의 실행 시작 시점에서 매개변수는 실제 인수와 같은 객체를 참조한다. 함수에서 매개변수의 값을 변경하면 인수의 형(type)에 따라 다은과 같이 구분한다.

  • 인수가 이뮤터블 한 경우: 함수 안에서 매개변수의 값을 변경하면 다른 객체를 생성하고 그 객체에 대한 참조로 업데이트된다. 따라서 매개변수의 값을 변경해도 호출하는 쪽의 실제 인수에는 영향을 주지 않는다.
  • 인수가 뮤터블 한 경우: 함수 안에서 매개변수의 값을 변경하면 객체 자체를 업데이트합니다. 따라서 매개변수의 값을 변경하면 호출하는 쪽의 실제 인수는 값이 변경된다.

다른 프로그래밍 언어에서는 실제 인수의 값을 매개변수에 복사하는 값에 의한 호출(call by value)을 사용하거나,

실제 인수의 참조를 매개변수에 복사하여 매개변수가 실제 인수와 같아지는 참조에 의한 호출(call by reference)을 사용한다.

얕은 복사(shallow copy)와 깊은 복사(deep copy)

객체가 갖는 멤버의 값을 새로운 객체로 복사할 때

  • 얕은 복사: 객체가 참조 자료형의 멤버를 포함한다. 즉, 참조값만 복사한다.
  • 깊은 복사: 참조값뿐만 아니라 참조하는 객체 자체를 복사한다. 즉, 객체가 갖는 모든 멤버(값과 참조 형식 모두)를 복사한다. 전체 복사라고도 한다.

예를 들어

#shallow copy
>>>x = [[1, 2, 3], [4, 5, 6]]
>>>y = x #y = x.copy() 와 동일
>>>x[0][1] = 9
>>>x
[[1, 9, 3], [4, 5, 6]]
>>>y
[[1, 9, 3], [4, 5, 6]]

#deep copy
>>>import copy
>>>x = [[1, 2, 3], [4, 5, 6]]
>>>y = copy.deepcopy(x)
>>>x[0][1] = 9
>>>x
[[1, 9, 3], [4, 5, 6]]
>>>y
[[1, 2, 3], [4, 5, 6]]