在for循环中分配值而不是引用

时间:2012-09-19 14:47:05

标签: python string list reference variable-assignment

我有一个字符串列表,我想为列表中的每个字符串将其存储在字典中并将其发送到另一个函数。到目前为止它看起来像这样:

list = ['75001', '75002', '75003']
params = {}
for elt in list:
    params['elt'] = elt
    ...
    foo(params)

但问题是我存储了对elt的引用而不是值,所以在我的函数调用中我总是有列表的最后一个元素:

params['elt'] = '75003'

我怎么能只储存价值而不是参考?

4 个答案:

答案 0 :(得分:2)

list = ['75001', '75002', '75003']
params = {}
for elt in list:
    params[elt] = elt
    ...
    foo(params)

只需移除eltparams['elt']周围的引号即可。您目前正在做的是反复更改键'elt'的值。

如果您每次都想要一本新词典,那么您可以这样做:

list = ['75001', '75002', '75003']
for elt in list:
    foo({'elt': elt})

答案 1 :(得分:2)

问题是所有函数都获得相同的字典。试试这个:

list = ['75001', '75002', '75003']
for elt in list:
    params = {}
    params['elt'] = elt
    ...
    foo(params)

现在每次调用foo()都会获得一个新容器,他们再也看不到了。

答案 2 :(得分:2)

如果你想要一个在你把它传递给foo后没有改变的dict,你应该复制一个dict:

params = {}
for elt in list:
    params['elt'] = elt
    ...
    foo(params.copy())

现在,在循环中稍后对params的进一步更改不会影响您发送到params的{​​{1}}副本。

这与Aaron Digulla的回答不同,foo仍然可以在循环之外创建。如果在代码中声明了params,并且您不想将其移动到循环中,这可能很有用;或者如果初始实例化是昂贵的,并且您不想多次执行此操作。

答案 3 :(得分:1)

我想你想要这样的东西:

zip_codes = ['75001', '75002', '75003']
for zip_code in zip_codes:
    params = {}
    params['zip code'] = zip_code
    ...
    foo(params)

这会在每次循环时创建一个新的空字典,并在调用foo()之前将列表中的值添加到它中,尽管除非您确定每次都指定相同的键,否则不需要它通过循环。另一种方法是将其移回循环,并在循环顶部调用params.clear()。当然,在必要时调用foo()之前,可以添加其他密钥和相应的搜索信息。