파이썬의 기묘한 특징들

Heebeom·2023년 3월 29일
0

파이썬의 역사는 깊으며, 수많은 버전 업을 통해 내부적으로 효율화를 거쳐왔다. 하지만 이러한 '효율화'가 때때로 개발자에게 혼란을 안겨줄 수 있으며, 이는 치명적 버그를 발생시킬 수 있다.

물론 이러한 일은 매우 회소하게 일어나니, 파이썬의 특징을 재미있게 알아보는 마음으로 포스팅을 읽어보기 바란다.

본 포스팅은 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) # True
  • 파이썬은 문자열도 효율화를 위해 재사용한다.
    spam과 eggs에 'cat' 문자열을 할당했을 때, 두 변수가 가르키는 id는 같다.
    이와 같은 최적화를 문자열 인터닝(interning)이라 한다.

  • 하지만 + 같은 연산자로 'cat'을 만들면, 인터닝을 시행하지 않는다.
    * 이 이유는 최적화를 위한 검사의 비용이 더 들기 때문이다.

파이썬의 가짜 증감 연산자

spam = 42
spam = --spam
print(spam) # 42

spam = -42
print(+spam) # -42
  • 파이썬에는 증감 연산자가 없다.
    위 코드는 문법상 옳지만, --spam은 부정 연산자를 중복한 것이다.
    이러한 부정 연산자를 3개 이상도 충분히 쓸 수 있다.

  • 파이썬의 '+' 연산자는 이전 부호 그대로 값을 평가한다.
    * 사용자가 연산자를 오버로딩 할 때, - 연산자를 보완하기 위해 존재한다.

부울 값은 정수값이다.

isinstance(True, bool) # True
isinstance(True, int) # True

print(True + False + True + True) # 1 + 0 + 1 + 1과 동일
print(-True) # -1과 동일
print(42 * True) # 42 * 1과 동일
print('hello'[True]) # 'hello'[1]과 동일
  • 42.0과 42을 동일하게 취급하듯이, 부울값 True, False도 각각 1, 0으로 취급한다.
    파이썬의 부울 데이터 타입은 int 타입의 하위 클래스이다.
    파이썬의 부울값에 isinstance() 사용하면 bool, int다 True이다.
    * 부울값을 위 예시와 같이 연산자와, 인덱스에 사용할 수 있다.

profile
이도저도 아닌 개발자

0개의 댓글