奇怪的是 - 至少对我而言 - 正在这段代码中发生。
我有一个函数,我从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']
答案 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