制作一个dict传值的列表

时间:2012-12-10 16:54:05

标签: python pass-by-value

我在dict列表中有点头疼。

def funk(x):
    for i in x:
        i['a'] += 1
        print i

list1 = [{'a':1, 'b':2}, {'a':3, 'b':4}]
funk(list1)
print list1

这将输出:

{'a': 2, 'b': 2}
{'a': 4, 'b': 4}
[{'a': 2, 'b': 2}, {'a': 4, 'b': 4}]

但我希望有这个:

{'a': 2, 'b': 2}
{'a': 4, 'b': 4}
[{'a':1, 'b':2}, {'a':3, 'b':4}]

如何让list1保持不变? 例如: [{'a':1,'b':2},{'a':3,'b':4}]

3 个答案:

答案 0 :(得分:5)

funk()可以复制x并修改该副本,而不是修改原始x

import copy

def funk(x):
    x = copy.deepcopy(x)
    for i in x:
        i['a'] += 1
        print i

list1 = [{'a':1, 'b':2}, {'a':3, 'b':4}]
funk(list1)
print list1

答案 1 :(得分:1)

显然,它是否可行取决于您的操作的复杂性/目标,但不是使用list comprehension来创建新的列表,而是使用{{3}}来创建新的列表:

def funk(x):
    return [{key: value+1 if key == "a" else value for key, value in i.items()} for i in x]

在您的示例中,您正在打印值,因此这不会有用,但如果您的意图可以通过新的,更改的dicts列表来填充,则可能是最佳路径。

答案 2 :(得分:0)

在我看来,字典的copy方法可能对您有所帮助:

def funk(x):
    for i in x:
        new_dict = i.copy()
        new_dict['a'] += 1
        print new_dict