2017-02-07 7 views
4

그래서파이썬은 - 참고로 값 defaultdict로 사전을 통과하지하는 방법을

attributes = { 'first_name': None, 'last_name': None, 'calls': 0 } 
accounts = defaultdict(lambda: attributes) 

문제는 기본 사전 I 통과하는 것입니다 내가 다른 사전의 기본 값으로 사전을 가지고 있다고 into defaultdict (attributes)는 참조로 전달됩니다. 그것을 어떻게 가치로 전달할 수 있습니까? 난 단지 전화 '에 대한 각각의 값을 증가하기 때문에

accounts[1]['calls'] = accounts[1]['calls'] + 1 
accounts[2]['calls'] = accounts[2]['calls'] + 1 
print accounts[1]['calls'] # prints 2 
print accounts[2]['calls'] # prints 2 

내가 1을 인쇄하는 그들 각각을 원하는 - 하나의 키의 값을 변경하면 다른 키

예를 들어

의 값을 변경하지 않도록 한 번.

+0

원하는 경우 복사본을 명시 적으로 만들어야합니다. 매개 변수를 전달하는 것은 항상 참조를 전달하는 것과 같습니다. –

+0

파이썬에는 평가 전략이 하나뿐입니다. [공유하여 호출] (https://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_sharing). –

+0

다음과 같이하십시오 : http://stackoverflow.com/questions/3975376/understanding-dict-copy-shallow-or-deep/3975388#3975388 – sangheestyle

답변

8

보십시오 : 당신이 기본 값 목록이있는 딕셔너리를 필요로 할 때

accounts = defaultdict(attributes.copy) 

파이썬 3.3 이후 listsalso have copy method 그래서 당신은 그것을 위와 defaultdict들과 같은 방법을 사용할 수 있습니다.

+3

ooooooo 매우 영리합니다! –

+1

예! 팩토리는 누락 된 키에 사용할 값을 반환하는 함수 일 수 있습니다 (인수없이 호출 할 수있는 한).'attributes.copy'는 바로 그런 함수입니다! – kindall

+0

예! 완벽하게 작동합니다. – satnam

2

나는 정말 warvariuc의 해결책을 좋아합니다. 그러나 dictdefaultdict ...으로 전달하지 않으므로 TypeError이됩니다. 그 인수는 호출 가능이어야하기 때문입니다. 당신은 람다에서 문자 그대로 사용할 수있었습니다. 또는 더 나은 방법은 도우미 함수를 정의하는 것입니다.

>>> def attribute(): 
...  return { 'first_name': None, 'last_name': None, 'calls': 0 } 
... 
>>> accounts = defaultdict(attribute) 
>>> accounts[1]['calls'] = accounts[1]['calls'] + 1 
>>> accounts[2]['calls'] = accounts[2]['calls'] + 1 
>>> print(accounts[1]['calls']) 
1 
>>> print(accounts[2]['calls']) 
1