2013-08-30 6 views
1

주문 사전의 값을 변경해야합니다. for 루프를 사용했지만 값이 변경되지 않았습니다. 나는 브래킷 [] 표기법을 직접 사용하기보다는 루프의 변수 이름에 할당했기 때문에 이것이 발견되었습니다. 루프 변수 이름으로 루프의 값을 참조 할 수없는 이유는 무엇입니까?Python ordered dictionary : for 루프를 사용하여 사전 값을 변경하는 데 [] 부호가 필요한 이유는 무엇입니까?

는 시도 :

idx = 0 
for name,val in settings.items(): 
    idx += 1 
    val = idx 
    print name,val 

결과 : 예상 OrderedDict([('Accel X Bias', None), ('Mag X Bias', None)])

: OrderedDict([('Accel X Bias', 1), ('Mag X Bias', 2)])

전체 코드 :

import collections 
settings = collections.OrderedDict([('Accel X Bias', None), ('Mag X Bias', None)]) 
idx = 0 

print "\nIn loop, values are changed:" 
for name,val in settings.items(): 
    idx += 1 
    val = idx 
    print name,val 

print "\nAfter Loop, values didn't change:\n",settings 

for name,val in settings.items(): 
    idx += 1 
    val = idx 
    settings[name] = idx 
print "\nAfter Loop, bracket notation used, values changed successfully:\n",settings 

이 아마 그래서 내가 관심이있는 몇 가지 기본적인 프로그래밍 원칙이다 '왜'그래서 나는 더 착각하지 않는다. 이런 식으로. 감사!

답변

5

루프에서 nameval은 매핑의 각 개체에 차례대로 입니다. 단순히 리 바인딩은 원래 반복 가능을 수정하지 않습니다.

6

파이썬에서 변수 이름은 "값"을 가리키는 참조입니다. 다음은 val = idx을 시도하기 전에 보이는 방법은 다음과 같습니다

enter image description here

을 그리고 여기 후 것 같습니다 무엇 : 대신 settings['Accel X Bias'] = idx을 한 경우

enter image description here

, 당신이 얻을 것 :

enter image description here