2010-12-03 9 views
7

전체 :파이썬에서 객체의 참조 목록을 얻으려면 어떻게해야합니까?

a = 1 
b = a 
c = b 

는 지금은 [a, b, c]입니다 태그 객체 1의 목록을 얻을 싶어요. 내가 어떻게 할 수 있니?

여기에 공식적으로 변수 "a"를 호출하는 방법은 무엇입니까? 지금까지는 객체의 "객체 태그"라는 것을 알고 있지만, 그 객체의 용어는 무엇인지 전혀 알지 못합니다.

감사합니다. 같은 C, I는 = 2를 다시 할당하면 A, B는 C 2를해야 다른 언어로

a = b = c = 1 
print a, b, c 
1 1 1 
a = 2 
print a, b, c 
2 1 1 

하지만, 파이썬에서, 그런 일이 같은 없다 :

왜 나는이 필요합니까 참조, 그래서 abc의 모든 값을 변경하는 유일한 방법은 내가 아는 한 지금까지 = b = c = 2이며, 이것이 목적의 모든 참조를 얻는 데 목적이있는 이유입니다.

+0

왜? 왜 이걸 원하니? 가능한 목적은 무엇입니까? –

+0

문제가 업데이트되었습니다. – user478514

+2

이제/what/you want 만/why/why/want를 반복하십시오. – pillmuncher

답변

2

당신이 요구하는 것은 실용적이지 않고 불가능합니다. 파이썬에서 특정 객체에 대한 모든 참조를 찾을 수 없습니다

>>> a = 1 
>>> b = a 
>>> c = b 
>>> locals() 
{'a': 1, 'c': 1, 'b': 1, '__builtins__': <module '__builtin__' (built-in)>, '__package__': None, '__name__': '__main__', '__doc__': None} 
>>> [key for key, value in locals().items() if value == 1] 
['a', 'c', 'b'] 
>>> globals() 
{'a': 1, 'c': 1, 'b': 1, '__builtins__': <module '__builtin__' (built-in)>, '__package__': None, '__name__': '__main__', '__doc__': None} 
>>> [key for key, value in globals().items() if value == 1] 
['a', 'c', 'b'] 
+0

덕분에, 그 하나의 접근 방식이지만 그 의미에 나를 위해 아무 의미가있다, 내 질문은 "변수"를 표현하려고하는 것입니다, B, C는 값 1의 "심판", 그들은 가치의 동일한 참조 1,하지만 다른 d = 1을 정의하면 id (d)가 id (a)와 동일하다는 것은 의심의 여지가 없지만 여기에는 d.value = a.value의 평균이 있다고 생각되지만 d = a는 아닙니다. DO는 내가 알고있는 파이썬에서 같은 객체를 태그한다. – user478514

+0

@ user478514 : 그게 * 할 수 없다는 것을 약간 보여줍니다. –

+0

나는 그것을 할 수 있다고 믿는다; 아래 내 대답을 참조하십시오. –

2

: 여기에 그 일을 한 미친 방법이있다. 파이썬에서 모든 객체 또는 모든 참조를 찾을 수도 없습니다. 합니다 (CPython의 기능 gc.get_objects에서이 작업을 수행하지만, 파이썬 구현에 걸쳐 이식 할 수 없습니다.)

당신은 dir() 또는 locals() 프로그램에서 어떤 범위에있는 모든 변수를 찾는 데 사용할 수 있습니다. 그러나 객체가 다른 장소에 정의 된 경우이 메소드로 객체를 놓칠 수 있습니다.

+0

'objgraph'가 정확히 주어진 객체에 대한 참조를 찾는다는 사실을 고려할 때 당신의 답은 사실 잘못되었다고 생각합니다. –

+0

@ErikAllik 이것은 GC의 비 휴대용 기능에 의존하기 때문에 일부 Python 구현에서만 가능합니다. 예를 들어 자이 썬에서는 작동하지 않습니다. 나는 대답에서 그것을 언급 할 것이다. – Heatsink

9

자세히 알 수 있듯이 모든 것을 찾을 수는 없습니다.

>>> sys.getrefcount(1) 
791 
>>> sys.getrefcount(2) 
267 
>>> sys.getrefcount(3) 
98 
1

우선 C에서 "="은 값 할당이며 참조를 생성하지 않습니다. 보다 구체적으로 a = b = 1이라고 쓰면 어떤 일이 일어나는가? 다음

(1), B = 1 평가 얻는다 할당 B 1 및 1을 반환하므로 식은 A와 B = 1

(2) = 1을 평가 얻는다 할당 1이 다음 (1)를 리턴 어느 곳에도 사용되지 않습니다.

그러면 a = 1은 예상대로 a 만 변경합니다.

모든 변수는 참조이므로 조금 더 복잡하지만 숫자는 불변이므로 다르게 취급합니다. 즉 a = 1과 b = 1을 쓸 때 a는 b를 True를 반환합니다. 하지만 하나를 변경해도 다른 하나는 변경되지 않습니다.

그러나 이것은 개체에 대해서는 발생하지 않으며 참조가 예상대로 작동합니다. 따라서 설명하는 것을하고 싶다면 원하는 값을 보유하고있는 새로운 객체를 정의하고이를 변수에 할당해야합니다.

7

일부 잘못된 정보를 여기에 설명하고 싶습니다. 이것은 "int가 불변"이라는 사실과 아무런 관련이 없습니다. a = 2을 쓸 때 aa 만 다른 것으로 지정하면 bc에는 영향을 미치지 않습니다.

당신은, 그러나 특성a의를 수정 한 후이 효과 bc 있다면. 다행히도이 예제가 내가 말하는 것에 대해 더 잘 보여줍니다.

>>> a = b = c = [1] # assign everyone to the same object 
>>> a, b, c 
([1], [1], [1]) 
>>> a[0] = 2   # modify a member of a 
>>> a, b, c 
([2], [2], [2])  # everyone gets updated because they all refer to the same object 
>>> a = [3]   # assign a to a new object 
>>> a, b, c 
([3], [2], [2])  # b and c are not affected 
3

objgraph에 관심이 있으실 겁니다. 메모리에서 객체 그래프를 탐색하거나 객체 그래프의 PNG을 덤프 할 수 있습니다. 메모리 누수를 디버깅하는 데 유용합니다. pyjack에서 http://mg.pov.lt/objgraph/

0

봐 :

은이 페이지를 참조하십시오. 그것의 replace_all_refs 함수는 객체에 대한 모든 참조를 대체하는 데 꽤 잘 작동하는 것처럼 보입니다. 참고 : 문자열 개체와는 제대로 작동하지 않습니다.

관련 문제