2012-09-24 7 views
2

이상한 것 - 적어도 저에게 -이 코드 단편에서 뭔가가 일어나고 있습니다.요소를 나열하고 추가하십시오.

WS 메소드에서 상기 한 기능이 있습니다. 나는이 기능을 처음 호출하면 왜, params의 값이 될 것입니다 알고 싶은 OFFERTA_MAP_DICT의 내용 생략

try:  
    tipo = d['id_tipo_offerta'] 
    params = OFFERTA_MAP_DICT[tipo] 
    params.append('days_constraints') 
except Exception, s: 
    self.log_int_raise("core.struttura._parseDictOfferta(): 1 Error=%s", RED(s)) 

(이 특정한 경우에 빈 목록) : 내 함수는 다음과 같은 것입니다 ['days_constraints'] 그리고이 함수를 호출 할 때마다 매개 변수 값은 n 요소입니다. 여기서 n은이 함수를 호출 한 횟수입니다.

첫 번째 과제물을 참고로 작성 했습니까?

편집 :

사람들은 그것을 을 복사하지 않습니다 ... 내지도

OFFERTA_MAP_DICT= { 
     ID_OFFERTA_SCONTOCAMERA: ID_OFFERTA_SCONTOCAMERA_KEYS, 
     ID_OFFERTA_BEFOREDATE:  ID_OFFERTA_BEFOREDATE_KEYS, 
     ID_OFFERTA_BEFORENDAYS:  ID_OFFERTA_BEFORENDAYS_KEYS, 
     ID_OFFERTA_XFORY:   ID_OFFERTA_XFORY_KEYS, 
     ID_OFFERTA_SCALARE:   ID_OFFERTA_SCALARE_KEYS, 
     ID_OFFERTA_PACCHETTI:  ID_OFFERTA_PACCHETTI_KEYS, 
     ID_OFFERTA_LAST_MINUTE:  ID_OFFERTA_LAST_MINUTE_KEYS, 
     ID_OFFERTA_ADVANCE:   ID_OFFERTA_ADVANCE_KEYS 
     } 


OFFERTA_ROOM_MAP_DICT= { 
     ID_OFFERTA_SCONTOCAMERA: ['id_tipo_sconto', 'valore_sconto', 'id_tipo_prezzo'], 
     ID_OFFERTA_BEFOREDATE:  ['id_tipo_sconto', 'valore_sconto', 'id_tipo_prezzo'], 
     ID_OFFERTA_BEFORENDAYS:  ['id_tipo_sconto', 'valore_sconto', 'id_tipo_prezzo'], 
     ID_OFFERTA_XFORY:   [], 
     ID_OFFERTA_SCALARE:   [], 
     ID_OFFERTA_PACCHETTI:  ['prezzo'], 
     ID_OFFERTA_LAST_MINUTE:  ['id_tipo_sconto', 'valore_sconto', 'id_tipo_prezzo'] 
     } 
+0

@delnan - 좋은 지적. 그걸 잡지 못했어요. – mgilson

답변

2

지정은 항상 참조로 완료됩니다. 목록의 (얕은) 복사본을 만들고 싶다면 슬라이스하십시오.

lnew = lold[:] 
+0

엄격히 말하면 ... 파이썬은 C 언어와 같은 방식으로 '참조에 의한'과 '가치에 의한'것이 거의 없습니다. 그러나이 경우에는 좋은 비유입니다. –

+0

@StuCox - 니트 틱으로 간다면 C의 모든 것이 값으로 전달됩니다. "참조에 의한"패스는 값으로 포인터를 전달함으로써 모방됩니다. 즉, 나는이 대답의 의미가 절대적으로 옳다고 생각한다. 파이썬은 그것들을 참조라고 부르며 할당은 실제로는 오른쪽에있는 객체에 대한 새로운 참조를 만드는 것입니다. – mgilson

1

params = OFFERTA_MAP_DICT[tipo] 변수 이름 params-OFFERTA_MAP_DICT[tipo]를 할당합니다. OFFERTA_MAP_DICT[tipo]은 목록이므로 params은 이제 같은 목록을 가리 킵니다. 당신이 params.append('days_constraints')을 수행 할 때

그래서, 당신은 그래서 당신은 다음 코드 블록에 올 때 ... 목록 OFFERTA_MAP_DICT[tipo]에 추가하고, OFFERTA_MAP_DICT[tipo] 이미 등, 'days_constraints'당신이 다시 추가하는 추가

있다

copy 모듈을 사용하여 복사 (또는 딥 복사)를 수행 할 수 있지만 나중에 params을 어떻게 사용 하느냐에 따라 더 좋은 방법이있을 수 있습니다.

0

코드에서 실제로 일어나고있는 일을 파악하는 것은 꽤 어렵습니다. 그러나 수행 할 때

params = OFFERTA_MAP_DICT[tipo] 

params에 참고 문헌 OFFERTA_MAP_DICT에 저장된 동일한 목록입니다. 해당 목록에 추가하면 변경 사항이 참조를 공유하기 때문에 OFFERTA_MAP_DICT에 반영됩니다.

0

params은 함수를 호출 할 때마다 동일한 목록에 대한 참조이며, OFFERTA_MAP_DICT[tipo]과 같은 목록입니다. 따라서 매번 같은 목록에 해당 텍스트를 반복적으로 추가하고 있습니다.

파이썬의 모든 과제는 참조를 할당합니다. 목록 복사는 다음과 같이 몇 가지 방법으로 수행 할 수 있습니다.

params = OFFERTA_MAP_DICT[tipo][:]  # take slice of whole list 
params = list(OFFERTA_MAP_DICT[tipo]) # construct new list 
params = copy(OFFERTA_MAP_DICT[tipo]) # from copy import copy 
관련 문제