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]paramsOFFERTA_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 に答える