Python tech/고급 파이썬 공부

파이썬 내부 동작을 알아보자

콜레오네 2023. 3. 31. 01:11

파이썬 기초 문법을 다 익혔다면

파이썬 내부 동작하는 구조와 파이썬만의 독특한 특징을 이해할 필요가 있다.

.

.

해당 포스팅은 [클린코드, 이제는 파이썬이다] 저서의 일부입니다.


256 is 256 == True but 257 is 257 == False

아주 기이한 현상이다.
파이썬은 value 비교를 == 연산자를 통해, id 비교를 is 연산자를 통해 한다.
물론 id()를 통해 value 비교로 == 연산자를 활용하면 id 비교가 가능하다.

파이썬은 모든 프로그램이 시작할 때
자주 쓰이는 정수 리터럴 객체를 미리 생성한다.
-5 부터 256까지가 그 범위이다.
CPython 인터프린터가 자동으로 -5에서 256까지의 객체를 미리 생성하고 시작한다.
그래서 다음과 같은 결과가 나오기도 한다.

>>> a = 256
>>> b = 256
>>> a is b
True
>>> c = 257
>>> d = 257
>>> c is d
False

문자열 인터닝 Interning

문자열 리터럴을 표현하기 위해 파이썬은 내부에서 객체를 재사용한다.

>>> spam = 'spam'
>>> ham = 'spam'
>>> spam is ham
True
>>> id(spam) == id(ham)
True

위와 같이 spam과 ham에 같은 문자열 리터럴을 할당했다.
그리고 두 변수의 id는 동일하다.
이를 문자열 인터닝이라 하며, CPython 구현 세부 사항이다. 알아만 두자.

아무것도 없으면 True인 all()

all() 내장함수는 iterator 객체가 모두 True라면 True를 반환하고,
단 하나라도 False라면 False를 반환한다.

>>> a
[1, 2, 3, 4, 5]
>>> all([i > 1 for i in a])
False
>>> all([i > 0 for i in a])
True

하지만 iterator 객체가 아예 비어있다면? 마찬가지로 True로 반환된다는 점을 조심하자

>>> b = []
>>> all([i > 0 for i in b])
True

비어있는 리스트도 True로 반환된다.
논리적으로 어색하지만, 이를 염두해두고 예외 처리에 조심하자

int이면서 bool인 True, False

True와 False는 bool 값을 가지지만, 동시에 int이기도 하다.
True는 1을 나타내며, False는 0을 나타낸다.

>>> True == 1
True
>>> False == 0
True
>>> 5 * True
5
>>> 5 * False
0
>>> 'python'[True]
'y'
>>> 'python'[False]
'p'

이처럼 True와 False를 활용해도 연산을 하거나 인덱스 처리를 하는데 문제없다.
하지만 문제가 없을 뿐, 이를 실제 코드에서 작성하면 안된다.
if 조건을 통해 연산을 다르게 하는 것이 현명할 것이다.

반응형