列出并追加元素

时间:2012-09-24 13:03:45

标签: python

奇怪的是 - 至少对我而言 - 正在这段代码中发生。

我有一个函数,我从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的值将为{{1}我每次还记得这个函数,params的值将是['days_constraints'] n 元素,其中 n 是我记得这个函数的时间

我的第一个作业是通过参考完成的吗?

修改

这些是我的地图

['days_constraints','days_constraints',....,'days_constraints']

4 个答案:

答案 0 :(得分:2)

通过引用总是完成作业。如果你想制作一个(浅)副本的列表,然后切片。

lnew = lold[:]

答案 1 :(得分: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的方式,我怀疑可能有更好的方法来实现它

答案 2 :(得分:0)

要真正掌握代码中发生的事情是非常困难的。但是,当你这样做时:

params = OFFERTA_MAP_DICT[tipo]

params是对存储在OFFERTA_MAP_DICT中的相同列表的引用。当您附加到该列表时,您还会看到OFFERTA_MAP_DICT中反映的更改,因为它们共享参考。

答案 3 :(得分: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
相关问题