코딩 스쿨에 오신것을 환영합니다~~

질의응답 게시판

 
is 연산자에 대한 질문입니다(긴 질문)
오 * 진 | 2019-01-19

스타트 파이썬에 is연산자가 나오진 않지만 질문해봅니다.

a=[1,2,3]
b=a

이렇게 입력해주면

id(a) 가 id(b) 와 동일한 값을 가지게 되고

a is b 도 True 를 반환하는데

id(a) is id(b) 는 왜 False 를 반환할까요?

----------------------------------------------

라고 질문을 올리려는 순간 갑자기 어떤 생각이 들어서

id(id(a)) 를 입력해보고
id(id(b)) 를 입력해봤더니 다른 숫자가 출력되는걸 보고

뭔가 이상하다는 생각이 들어서 이것저것 생각나는 코드들을 쳐보니까

id(a) is id(a) 마저도 False 를 반환한다는걸 알아냈습니다.

그리고 type(id(a)) 로 id(a)는 정수형의 자료형이라는 사실을 알아냈고요


그다음엔 파이썬쉘에다가 id(id(a)) 를 계속 쳐봤는데 칠때마다

값이 달라지더라고요. 

그렇다면 a = [1,2,3] 이라고 쳤을때 [1,2,3] 리스트가 생성되서 어떤 메모리주소에
저장되고 

그 메모리주소를 나타내기위한 id(a)는 1582339961800 처럼 정수인데 
호출될때마다 이 정수를 각기 다른 메모리에 저장하기 때문에

id(a)의 메모리 주소를 나타내는 id(id(a)) 값은 계속 바뀌는 것인가? 라는 생각이 들면서 또 이것저것 쳐봤는데

>>> a=[1,2,3]
>>> id(a)
1582839961800
>>> a=[1,2,3]
>>> id(a)
1582839961032
>>> a=[1,2,3]
>>> id(a)
1582839961672


이거처럼 a에 [1,2,3]이라는 리스트를 저장할때마다 id 값이 바뀌는데

>>> a=123
>>> id(a)
140714226401936
>>> a=123
>>> id(a)
140714226401936
>>> a=123
>>> id(a)
140714226401936


a에 123이라는 정수를 저장할때는 계속해도 id값이 그대로네요

대체 왜 이런 차이가 나오는 건가요?

이쯤 오니까 내가 뭘 모르는지 모르겠다는 생각이 들고

미로에 갇혀서 헤매는 거 같은 느낌도 들고

사실 이 미로는 출구같은건 없고 귀도반로섬씨만 아는 비밀번호를 외쳐야만

탈출할수있는 닫힌 미로인 것인가 라는 생각도 들어서

이만 의식의 흐름대로 작성한 질문을 마치겟습니다.

  • 관 * 자
  • 2019-01-19 (15:04)
is 연산자는 ==와는 달리 데이터가 저장된 위치, 즉 포인터를 비교합니다.

>>> a=[1,2,3] 
>>> id(a) 
1582839961800 
>>> a=[1,2,3] 
>>> id(a) 
1582839961032 
>>> a=[1,2,3] 
>>> id(a) 
1582839961672 

에서는 리스트를 생성하여 변수 a에 저장할 때 마다 다른 메모리 공간을 사용하니 id(a) 값이 서로 달라집니다.

>>> a=123 
>>> id(a) 
140714226401936 
>>> a=123 
>>> id(a) 
140714226401936 

위의 123과 같이 흔히 쓰이는 정수와 같은 숫자 별도의 메모리 공간에 저장해 두고 필요할 때 그 값을 사용합니다. 하나의 메모리 공간에 자주 쓰이는 데이터는 저장해 두고 공유해서 사용하는 것이지요. 이렇게 함으로써 파이썬 내부에서 메모리를 효율적으로 사용하고 처리시간을 단축할 수 있습니다. 따라서 동일한 id() 값을 가지게 됩니다.

정수일지라도 자주 쓰이지 않는 것은

>>> a = 12341234
>>> id(a)
64253728
>>> a = 12341234
>>> id(a)
64253600

에서와 같이 다른 id()를 반환합니다.

a=[1,2,3] 
를 하면 리스트 데이터가 저장된 위치 포인터를 a에 저장합니다. 
사실 파이썬에서 변수는 내부적으로 데이터 그 자체를 의미하는 것이 아니라 데이터가 저장된 위치, 포인터를 의미합니다.

도움이 되시길...^^