2017-05-19 1 views
0

refcounts가 어떻게 파이썬에서 작동하는지 이해하려고합니다. 누군가가 그 객체의 단지 1 인스턴스 인 경우 카운트가 2로 인쇄되는 이유를 설명 할 수 있습니까? (때문에 getrefcount 방법에 전달 임시 존재의 그것입니까?) 또한 왜 수 많은 회원에서 호출 할 때 호출 할 때 (자기 참조 refcount가 범핑입니까?) 내재적 기준 단위는 사방이 있습니다Refcount python objects

import sys 

class A: 
    def print_ref_count(self): 
     print sys.getrefcount(self) 

a = A() 
print sys.getrefcount(a) # prints 2 
a.print_ref_count()  # prints 4 
print sys.getrefcount(a) # prints 2 

답변

2

파이썬. 는 (일시적)이 포함되어 있기 때문에,

가 반환되는 카운트가 예상하는 것보다 일반적으로 하나 더있다 : 당신이 함수에 인수로 a을 통과 할 때, incref - 에드 getrefcount의 자신의 문서화 문자열 노트로,이다 getrefcount()에 대한 인수로서의 참조. 당신이 메소드를 호출

두 개의 추가 참조는 각각 다음과 같습니다

  1. 방법 내 이름 self 보유 기준
  2. 그것이 바인딩 된 메서드 객체가 특정하게 될 때 생성 된 암시 적 참조 그 인스턴스에 a.print_ref_count (심지어 실제로 호출하기 전에); type(a.print_ref_count)은 (당신이 다음 del ato_print = a.print_ref_count을 할 수 있고, to_print 여전히 비록 a가 더 이상 인스턴스를 참조하는 일 없어야합니다)

얻기 인스턴스 및 방법 자체 모두에 대한 참조를 포함해야 임시 바운드 방법입니다 레퍼런스 카운트에 매달린 것은별로 도움이되지 않습니다; 이것은 파이썬 (CPython을 구체적으로 구현 한 것으로, 다른 파이썬 해석기는 참조 카운팅 가비지 콜렉션을 사용할 수 있고 할 수 있습니다)을 볼 수 있듯이 실제로는 명명 된 변수에 실제로 저장되지 않을 수있는 많은 암시 적 참조가 작성됩니다.

+0

사이드 노트 : ref 카운트 1을 얻는 것이 가능합니다. 오브젝트를 참조 카운트 할 목적으로 만 오브젝트를 작성하면됩니다. 오브젝트는 오브젝트를 저장할 때 변경할 수없는 리터럴이 될 수 없습니다. 함수의 상수, 빈'tuple '또는 불변 리터럴의 비어 있지 않은 튜플 등). 그래서'sys.getrefcount (A())'는 sys.getrefcount (''. join (('', 'b', 'c')))' 피 억류자를 피하십시오.) 어느 쪽도 도움이되지는 않지만. – ShadowRanger