2012-09-24 176 views
2

奇怪的事情 - 至少對我來說 - 正在發生在這段代碼中。列表和追加元素

我有一個函數,我記得從一個WS方法。 我的功能是這樣的:

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)) 

忽略的OFFERTA_MAP_DICT內容(在這種特定的情況下是一個空列表)我想知道爲什麼,如果我調用該函數的第一時間,params值將是['days_constraints']和其他時間我還記得這個函數,params的值將是['days_constraints','days_constraints',....,'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

不完全正確...... Python並沒有像C++那樣「按引用」和「按值定義」。但在這種情況下,這是一個很好的比喻。 –

+0

@StuCox - 如果你要挑選,C中的所有東西都是有價值的。通過引用傳遞是通過按值傳遞指針來模擬的。這就是說,我認爲這個答案的語義是絕對正確的。 Python將它們稱爲引用,並且賦值實際上只是在右側創建了對該對象的新引用。 – mgilson

1

聲明params = OFFERTA_MAP_DICT[tipo]分配OFFERTA_MAP_DICT[tipo]的變量名params ...它複製。由於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]的列表相同。因此,您每次都要將該文本重複附加到同一個列表中。

Python中的所有賦值都分配引用。複製清單可以用幾種方法完成:

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