2017-05-04 1 views
0

호기심 만 .. python의 "변수"는 객체에 대한 참조입니다. 각각 이라는 이름이 또는 "액세서 레이블"이므로 스크립팅 중에 참조 할 수 있습니다.동일한 객체를 가리키는 모든 변수 (참조 이름) 검색

각 파이썬 개체가 자신을 지칭하는 모든 "변수 이름"의 목록을 유지합니까? 어떻게 접근합니까?

# A random object 
class A(object): 
    pass 

# references to instances 
a = A() 
b = A() 
c = a 

# I happen to come accross one reference 
ref = c 

# This is how I find all the ways I can access it 
# i.e. all its "accessers" or "variable names" 
k, v = None, None # to avoid `RuntimeError: dictionary changed size..` 
for k, v in globals().items(): 
    if v is ref: 
     print(k) # prints "a c ref" since `a is c` and `c is ref` 

# Is there a way I may get this without looping over all variables? Like a.. 
ref.__getallreferencenames__() # AttributeError 
# Is that information stored and kept up to date somewhere? 

답변

0

파이썬의 varnames와 객체는 상당히 다른 것들입니다. 첫 번째는 해시 맵에서 지역 또는 전역과 같은 일부 범위에 해당하는 키입니다. 두 번째 부분은 힙 메모리의 실제 개체입니다. 그 질문을하지 않는 것이 훨씬 의미가있다. 당신이 생각 할 수있는 것은, 예를 들어, GC 모듈 자체에서 낮은 수준의 참조를 얻으려면 (하여 MyObj) gc.get_referrers를 호출하는 것입니다

글쎄, 말했다 가지고, 문제가 변환
c.get_referrers(object) 
+0

하나 실제 객체입니다 주어진 힙, 어떻게 그것에 연결된 모든 varnames 및 해당 범위를 얻을 수 있습니까? 'gc.get_referrers (ref) '를 사용하면 예상 한'['a ','c ','ref ']'보다 훨씬 많은 것을 얻을 수 있습니다. –

+1

네, 훨씬 더 많기 때문에)'gc.get_referrers (ref)'는 범위가 일반적으로 특정 코드 객체의 런타임에만 사용 가능하기 때문에'object -> scope' 관계가 아닌 객체의 목록을 제공합니다 프레임 객체에 바인딩 됨). 즉, 사물과 범위는 완전히 다른 짐승입니다. 반면에 범위를 매핑으로 지정하면 객체를 찾을 수는 있지만 런타임에 존재하기 때문에이 범위를 먼저 제공해야합니다. –

관련 문제