본문 바로가기
DEVELOPMENT/PYTHON

python integer caching 이란?

by Z@__ 2020. 9. 21.
반응형

PYTHON integer caching이란?

 

다음 문제를 통해 알아보자

 


파이썬에서 다음의 결과는 무엇일까?

a = 10
b = 10
a is b

 

a에 10을 할당했고, b에도 10을 할당했다. 그리고 a와 b가 같은지를 물어보았다.

결과는 당연히 True가 나올 것이다. 

실제로 해보면 다음과 같이 나온다.

너무나도 당연하다. 그럼 다음은 어떨까?


a = 300
b = 300
a is b

 

앞과 똑같이 a에 300을 할당, b에 300을 할당, a가 b와 같은지를 물어보았다.

이번에도 당연히 정답은 True??

실제로 실행해보면 다음과 같다.

 

결과는 False가 나왔다.... 왜일까..??

 

우선 python에서 is()연산자에 대해 알아보자


Python에서 is operators란

파이썬에서 is operator는 Identity operators라고 불리는데 특정 값이 어떤 클래스나 타입을 나타내는지 여부를 확인하기 위해서 사용된다. 예시코드를 보면 다음과 같다

즉, 'is'연산자는 왼쪽항의 변수가 오른쪽항과 같은 오브젝트를 가르키는지를 확인한다.

# Python program to illustrate the use 

# of 'is' identity operator

x = 5

if (type(x) is int):

    print("true")

else:

    print("false")
    
 # output : true

그렇다면 앞에서 본 것처럼 a is b라고 했을 때는 a와 b가 같은 오브젝트를 가르키는지를 묻는다는 건데....

한번 확인을 해봐야겠다.

a = 1
b = 1
print(id(a), id(b))

a = 300
b = 300
print(id(a), id(b))

 

id연산자란?
- 동일한 객체 여부를 판별하는 연산자입니다.
- id() 함수는 객체를 입력값으로 받아서 객체의 고유값(레퍼런스)을 반환하는 함수입니다.
- id는 파이썬이 객체를 구별하기 위해서 부여하는 일련번호입니다.
- 숫자로서 의미는 없습니다.
- id는 동일한 객체 여부를 판별할 때 사용합니다.

 

실행결과에서 보이듯이 a,b에 1을 할당했을 때는 같은 값을 갖고 300일 때는 다른 값을 갖는다는 것을 확인할 수 있다.

즉, 위에서  a is b의 결과가 True, False가 나오는게 정상이라는 이야기이다.

그렇다면 왜 같은 수를 할당했음에도 다른 값을 갖게 되는 것일까?

※ 바로 Python Integer Caching 때문이다.


Pythin Integer Caching이란

파이썬에서 -5 ~ 256에 해당 하는 작은 수들은 할당할 때는 이미 존재하는 오브젝트의 레퍼런스를 가져옴

그래서 a = 1과 b = 1이 같은 레퍼런스를 갖게 되는 것이다.

반면에 -5 ~256에 해당하지 않는 300은  a = 300, b = 300을 할 때마다 각각 다른 레퍼런스를 가져오는 것이다.

 

그래서 애초에 우리가 의도했던 대로 확인하기 위해서는

a = 300
b = 300
a is b

 

라고 하면 안되고

a = 300
b = 300
a == b

 

로 확인을 해야하는 것이다.

 

그리고 is 연산자 같은 경우 변수 뿐만 아니라 클래스, 리스트에서 사용이 가능하다.

아래의 링크를 참고하면 좋을 것 같다.

- https://stackoverflow.com/questions/52125009/python-3-integer-addresses

- https://wsvincent.com/python-wat-integer-cache/

 

Python WAT!? Integer Cache - William Vincent

Check out the following Python code: >>> x = 256 >>> x is 256 True >>> y = 257 >>> y is 257 False WAT! Why is Python doing this? The answer is twofold: is checks whether 2 things are the same object, not if they’re equal Python caches integers in the ran

wsvincent.com

 

실수값의 오차

-https://dojang.io/mod/page/view.php?id=2466

반응형

댓글