5장 연습 문제 6번

이번 문제는 순환 참조에 관련한 문제이다.
>>> a = [1]
>>> b = [2]
>>> a.append(b)
>>> b.append(a)
를 실행하고 확인하면 된다.

첫번째로, 위 코드를 실행 하고, a 와 b 값을 출력해 보면
>>> a
[1, [2, [...]]]
>>> b
[2, [1, [...]]]
와 같이 출력된다. a 와 b 모두 값이 계속 반복 되어 진다.

이것을 그림으로 표현해보면

            ↗→↓
a → [1,   ]   ↓
           ↑     ↓
b → [2,   ]   ↓
            ↖←↓

와 같이 나타내 볼 수 있다.

두번째로, 레퍼런스 카운트 값을 확인 해보는 것이다.
>>> import sys
>>> sys.getrefcount(a)
3
와 같이 실행 하면 3이 나오는데, a 와 b 가 참고 하고, getrefcount 를 하면서 한번 더 참고 하기 때문에 총 3이라는 값이 나온다.

세번째로, b를 지운 다음 a 의 레펀런스 카운트 값을 확인하는 것이다.
>>> del b
>>> sys.getrefcount(a)
3
와 같이 결과가 나오는데, 즉, b가 지워 지더라도 위 그림에서와 같이 단지 b 가 가리키는 것이 없어진 것 뿐이다.

그리고 a를 출력 해보면
>>> print a
[1, [2, [...]]]
와 같이 나오는데, 객체 역시 변경 되지 않았다.

            ↗→↓
a → [1,   ]   ↓
          ↑     ↓
       [2,   ]   ↓
           ↖←↓

그림으로 표현 하면 위와 같다.

마지막으로 a를 삭제 해보는 것인데,
>>> del a
를 하면 더 이상 두 객체를 건드릴 수 없게 된다. 그렇다고 해서 그 두 객체가 지워진 것은 아니다.

레퍼런스 카운트 값이 0이 되지 않았기 때문이다.

그림으로 표현 하면

            ↗→↓
       [1,   ]   ↓
          ↑     ↓
      [2,   ]   ↓
           ↖←↓

와 같이 가리키는 변수 없이 객체만 남아 있게 된다. 이로 인해서 메모리에 두 객체가 계속 남아 있게 된다.

댓글 없음:

댓글 쓰기