파이썬의 역사는 깊으며, 수많은 버전 업을 통해 내부적으로 효율화를 거쳐왔다. 하지만 이러한 '효율화'가 때때로 개발자에게 혼란을 안겨줄 수 있으며, 이는 치명적 버그를 발생시킬 수 있다.
물론 이러한 일은 매우 회소하게 일어나니, 파이썬의 특징을 재미있게 알아보는 마음으로 포스팅을 읽어보기 바란다.
본 포스팅은 Al Sweigart의 저서인 『클린 코드, 이제는 파이썬이다』의 일부를 기반으로 작성되었습니다.
256 is 256은 참이지만, 257 is 257은 거짓이다.
- is 연산자는 두 객체가 동일한 아이디 값인지 비교한다.
* 42와 42.0은 각기 다른 아이디를 가진 객체이며, 42 is 42.0은 False이다.
- 파이썬은 프로그램 시작 시 -5부터 256까지 정수를 미리 생성한다.
이러한 정수를 미리 할당된(Preallocated) 정수라 부른다.
범위 안인 정수는 미리 할당된 것을 사용하고, 아니면 새로 생성하니 id가 다르다.
- 하지만 한번 더 257 is 257하면 True가 반한된다.
왜냐하면 파이썬은 새로 생성한 정수를 다시 재사용하기 때문이다.
값을 비교할 때에는, 'is' 대신 '==' 연산자를 사용해야 한다!
문자열 인터닝
spam = 'cat'
eggs = 'cat'
print(spam is eggs)
- 파이썬은 문자열도 효율화를 위해 재사용한다.
spam과 eggs에 'cat' 문자열을 할당했을 때, 두 변수가 가르키는 id는 같다.
이와 같은 최적화를 문자열 인터닝(interning)이라 한다.
- 하지만 + 같은 연산자로 'cat'을 만들면, 인터닝을 시행하지 않는다.
* 이 이유는 최적화를 위한 검사의 비용이 더 들기 때문이다.
파이썬의 가짜 증감 연산자
spam = 42
spam = --spam
print(spam)
spam = -42
print(+spam)
- 파이썬에는 증감 연산자가 없다.
위 코드는 문법상 옳지만, --spam은 부정 연산자를 중복한 것이다.
이러한 부정 연산자를 3개 이상도 충분히 쓸 수 있다.
- 파이썬의 '+' 연산자는 이전 부호 그대로 값을 평가한다.
* 사용자가 연산자를 오버로딩 할 때, - 연산자를 보완하기 위해 존재한다.
부울 값은 정수값이다.
isinstance(True, bool)
isinstance(True, int)
print(True + False + True + True)
print(-True)
print(42 * True)
print('hello'[True])
- 42.0과 42을 동일하게 취급하듯이, 부울값 True, False도 각각 1, 0으로 취급한다.
파이썬의 부울 데이터 타입은 int 타입의 하위 클래스이다.
파이썬의 부울값에 isinstance() 사용하면 bool, int다 True이다.
* 부울값을 위 예시와 같이 연산자와, 인덱스에 사용할 수 있다.