列出字典传递值

问题描述 投票:1回答:3

我在口述清单中有些头疼。

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}]

python pass-by-value
3个回答
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
投票

显然,它是否可行取决于操作的复杂性/目标,但不是就地修改列表,而是使用list comprehension创建一个新列表:

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

在您的示例中,您正在打印值,所以这没有用,但是如果您的意图可以通过拥有新的变更后的辞典列表来填补,则可能是最佳途径。


0
投票

在我看来,字典的copy方法可能在这里为您提供帮助:

def funk(x):
    for i in x:
        new_dict = i.copy()
        new_dict['a'] += 1
        print new_dict
© www.soinside.com 2019 - 2024. All rights reserved.