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']
        }
4

4 回答 4

2

分配总是通过引用完成。如果要制作列表的(浅)副本,请对其进行切片。

lnew = lold[:]
于 2012-09-24T13:10:44.383 回答
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”,然后您再次附加,等等。

您可以使用复制模块执行复制(或深复制),但根据您params以后使用的方式,我怀疑可能有更好的方法来解决它。

于 2012-09-24T13:10:26.213 回答
0

很难真正掌握代码中发生的事情。但是,当您这样做时:

params = OFFERTA_MAP_DICT[tipo]

params是对存储OFFERTA_MAP_DICT. 当您附加到该列表时,您还会看到该更改反映在其中,OFFERTA_MAP_DICT因为它们共享一个参考。

于 2012-09-24T13:11:54.193 回答
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
于 2012-09-24T13:12:51.000 回答