#python #anaconda #jupyter-notebook #visual-code #html #css #javascript #http

제목[re]id()함수가 궁금합니다2021-07-08 22:20
작성자 Level 10

[Q1에 대한 답변]


일단 질문으로 제시한 코드가 정상적이지 않지만, 답변을 해보도록 하지요.

비정상이라는 것은 anonynous object를 만들었기 때문으로, 아래의 15/16 줄 입니다.

먼저 1~3 줄의 코드는 a/b/c가 모두 동일하게 3에 해당하는 객체를 가르킵니다.

Python은 동일한 정보를 가르키는 서로 다른 변수들이 같은 id() 값을 return 합니다.

마찬가지로 13 줄에서 새로운 id() 값의 Foo 객체를 생성한 것을 볼 수 있습니다.

그런데, 15~18 줄에서 세개의 Foo()를 만드는데, 주소가 모두 같습니다.

이는 15/16 줄의 Foo() 객체를 만들긴 했지만, 변수로 전달하지 않았기 때문입니다.

즉, 이런 경우는 만들어졌지만, 프로그램에서 다시는 쓸수 없는 상태입니다.

이름이 없는 값이 컴퓨터 메모리에 있으니 유령처럼 돌아다닐 뿐 사용 불가이지요.

따라서 15줄에서 anonymous object를 만들고, 16줄에서 다시 anonymous object를 만들면, python은 메모리를 아끼기 위해서 쓰지 못할 15줄의 Foo()의 메모리 공간을 16줄의 Foo anonymous object가 재사용 합니다. 그러나 문제는 이 object도 이름이 없으니 쓸수가 없겠죠?

따라서 제대로 이름을 갖는 18 줄의 g에 해당하는 Foo 객체가 만들어지면, 앞서 anonymous object가 쓰던 공간을 다시 재활용 합니다. 그러니, 15~18 줄에서 만들어지는 객체들의 id()가 같게 나오지요.

바로 이어서 20 줄의 h 변수에 저장하는 Foo 객체는 다른 id() 값을 갖는 것을 볼 수 있습니다.

이렇게 메모리의 낭비를 피하는 기능을 Garbage Collection 기능이라고 합니다.



 

[Q2에 대한 답변]


Python 공식문서를 참조하면,

https://docs.python.org/3/library/functions.html#id 

"This is the address of the object in memory"라고 명확하게 언급됩니다.


[Q3에 대한 답변]


프로그래밍 언어는 약속입니다. 앞서 Q1의 예제처럼 변수가 "가르키는 (C/C++ 식으로 하면 pointing 하는" 객체의 주소를 전달하도록 "약속"되어 있는 겁니다.

댓글
이전id()함수가 궁금합니다2021-07-08
다음newline='' 질문2021-07-07