2009-09-21 7 views
2

내장 된 방법이 있는지 궁금하네요.이 간단한 코드를 예로 들어 보겠습니다.파이썬 : dict 값 포인터가 키를 저장합니까?

D = {'one': objectA(), 'two': objectB(), 'three': objectC()} 
object_a = D['one'] 

object_a이 첫 번째 줄에 생성 된 objectA()를 가리키고 있다고 생각하고 알고 있습니다. 사전에 대한 D,하지만 내 질문은, 파이썬 사전 값의 키를 저장합니까? 'one' 키를 가져 오는 방법은 변수 object_a (물론 사전을 반복하지 않고) 인 경우에만 사용할 수 있습니까?

하지 않으면, 내가 objectA() 내부의 값 'one'를 저장할 수 있지만, 파이썬은 이미 정보를 저장하는 경우 난 그냥 궁금 해서요.

답변

7

아니요.

(많은 수의) 서로 다른 사전에 단일 개체를 추가하는 경우를 고려하십시오. 파이썬이 당신에게 그것을 많이 사용하지 않는 기능에 많은 비용이들 것이라는 점을 추적하는 것은 꽤 비쌀 것입니다.

3

dict 매핑은 사용자가 설명하는 것처럼 쉽게 "가역적"이지 않습니다.

  1. 키는 변경 가능해야합니다. 조회를 위해 해시되고 자발적인 변경이 발생하지 않도록 불변이어야합니다.

  2. 값을 변경할 필요가 없으며 빠른 조회를 위해 해시되지 않습니다.

당신은 단순히 (1) 불변의 가치를 창출하고 (2) "반전"값으로 매핑의 다른 종류를 채우지 않고 다시 키 값에서 갈 수 없어 -> 키 매핑.

2

당신이 가진 모든 변수 object_a 입니다 경우 키 '하나'(사전을 통해 반복하지 않고, 물론 )를 얻을 수있는 방법이 있나요?

아니요, 파이썬은 거의 쓸모없는 중복을 부과하지 않습니다. objA는 호출 공장 인 경우 :

d = {'zap': objA()} 
a = d['zap'] 

b = objA() 

단지뿐만 아니라

L = [objA()] 
c = L[0] 

a, bc에서 참조 정확히 같은 종류의 모든 결과

에 정확하게 동등한 객체 (만약 그게 objA이 처음에 당신에게주는 것입니다), 1 비트 낭비하지 않고 n은 목록 또는 목록에있는 값/또는 이들 색인/키에서의 값을 기록한다. (또는 색인/키가 많은 경우가있을 수 있기 때문에 색인 또는 키)).

0

다른 사람들처럼 메모리가 필요하기 때문에 일반적으로 필요하지 않으므로 내장 된 방법이 없습니다.

그렇다면 objectA()에 'one'값을 저장할 수 있지만 파이썬이 이미 그 정보를 저장하고 있는지 궁금합니다.

이 작업을 자동으로 수행하는보다 일반적인 솔루션을 추가하는 것이 매우 쉽다는 점을 추가하고 싶습니다. 예를 들면 :는

def MakeDictReversible(dict): 
for k, v in dict.iteritems(): 
    v.dict_key = k 

이 기능은 단순히 객체를 저장하는 데 사용되는 사전 핵심 구성원 "dict_key"로 사전에 모든 객체를 포함합니다.

물론이 코드는 한 번만 사용할 수 있습니다 (즉, 개체를 공유하는 두 개의 서로 다른 사전에서 실행하고 개체의 "dict_key"멤버는 두 번째 사전으로 덮어 쓰게됩니다).

관련 문제