>>> ba = bytearray(b"")
>>> type(ba)
<class 'bytearray'>
>>> b = bytes([])
>>> type(b)
<class 'bytes'>
불변형(immutable) 객체 : 튜플, 문자열, 바이트
가변형(mutable) 객체 : 리스트, 바이트배열
파이썬의 모든 변수는 객체 참조(reference)이므로 가변 객체를 복사할 때는 매우 주의해야 한다.
얕은 복사(shallow copy) :
깊은 복사(deep copy) :
객체2 = copy.deepcopy(객체)
파이썬은 불변형의 str타입을 사용하여 문자열을 표현한다.
파이썬의 모든 객체에는 두 가지 출력 형식이 있다.
위의 그림에서는 python이라는 문자열을 담고있는 name 객체를 출력하였다. 각각 기본형(문자열), 문자열형, 표현형 으로 출력했다.
문자열 형식과 표현 형식의 출력형태는 문자열객체를 빼고는 같다. 문자열 객체를 출력할때만 따옴표가 붙는다.
사용자 객체를 기본형과 repr() 과 str()로 출력해보았다. 같은 결과가 나온다.
클래스에 __repr__()
와 __str__()
매직 메서드를 추가하고 출력해보았다.
repr() 함수는 __repr__()
를 호출하고, str() 함수는 __str__()
를 호출했다. 그리고 기본형으로 출력했을땐, __str__()
를 호출하는걸 알 수 있다.
__repr__()
은 개발자를 위한 것이다. 본질적인 목적은 대상이 무엇인지를 명확하게 설명하는 것이다.
__str__()
은 최종 사용자를 위한 것이다. 본질적인 목적은 객체에 포함된 데이터를 읽을 수 있는 방식으로 설명하는 것이다.
repr로 출력하면 따옴표가 붙여서 나오는걸 확인할 수 있다. 저것의 의미는 Car클래스의 BMW인스턴스라는걸 명확히 보여준다.
반면에, str로 출력하면 따옴표가 붙지않아서 의미가 모호하다.
따라서 repr은 객체가 무엇인지 명확하게 보여주는데 쓰이고, str은 코드를 사용하는 사용자가 읽기 쉽게 설명하게 적는것이 바람직하다.
객체를 정의 할때 위에 나온 문자열의 두가지 표현형식을 사용하는게 바람직하나, 하나만 쓰겠다고 한다면 repr을 하는게 낫다. 왜냐하면 __str__()
이 정의되지 않았을때 자동으로 __repr__()
을 호출하기 때문이다. 반면에 __str__()
만 정의되었다면 repr()로는 __str__()
에 접근을 못하고 원래 출력하는것 처럼 그 객체의 주소만 출력되기 때문이다.
인터프리터에서 print()를 쓰지않고 출력되는 경우는 repr을 호출한 것이다. 그래서 문자열을 출력하면 따옴표가 붙여져서 나온다.
**
이다."{number}---{player}".format(player:"길동", number:456)
가 되고 함수에 딕셔너리 형태가 전달될때는 자동으로 변환되어서 최종적으로 "{number}---{player}".format(player="길동", number=456)
가 되어서 위의 출력결과가 나온다.(item)
가 아닌 (item,)
로 해야한다. 그 이유는 쉼표를 쓰지 않으면 소괄호가 튜플을 뜻하는게 아니라 연산자 소괄호로 취급되기 때문이다.배열(또는 파이썬이 리스트)는 여러 요소들이 연속된 메모리에 순차적으로 저장되는 구조이다.
연결 리스트는 여러 분리된 노드가 서로 연결되어 있는 구조이다.
어떤 요소에 직접 접근할 때 배열의 시간복잡도는 O(1)이고, 연결 리스트는 O(n)이다. 연결리스트는 어떤 노드에 접근하려면 처음부터 순회를 시작해야 한다.
또한 연결 리스트에서 어떤 노드를 삽입할때는 노드들이 메모리에 연속적이게 저장되어 있지 않기때문에, 그 위치를 안다면 노드 수에 상관없이 시간복잡도는 O(1)이다.
배열에서 어떤 위치에 항목을 삽입하려면, 그 위치에서부터 모든 항목을 오른쪽으로 옮겨야 하므로 시간복잡도는 O(n)이다.
리스트 끝에서 항목을 추가/삭제 할땐 append()/pop() 메서드를 사용하며, 시간복잡도는(1)이다. 단, 리스트 중간에 항목을 삽입하는 insert() 메서드는 항목을 삽입한 후, 그 이후의 인덱스 항목들을 한칸씩 뒤로 밀어야 하므로 시간복잡도는 O(n)이다.
리스트 항목을 검색해야 하는 remove(), index(), 멤버쉽 테스트 in 등의 시간복잡도는 O(n)이다.
검색이나 멤버십 테스트 시 빠른 속도가 필요하면 셋이나 딕셔너리같은 컬렉션 타입을 선택하는 것이 더 적합할 수 있다.
리스트에서 항목을 순서대로 정렬하여 보관하면 빠른 검색을 제공할 수 있다.(시간복잡도가 O(logn)인 이진 검색 알고리즘)
1 << x
는 숫자 1을 x번 만큼 왼쪽으로 시프트 한다는 의미이다.x & (x - 1)
이 0인지 확인하면, x가 2의 제곱인지 아닌지 신혹하게 확인할 수 있다. (2의 제곱인 수들은 맨 첫자리만 1이고 나머지는 0이다. 그러므로 x & (x - 1) == 0
이면 2의 제곱수가 된다.