Python - 如何将字典作为值传递给defaultdict而不是引用

6

假设我有一个默认值为另一个字典的字典

attributes = { 'first_name': None, 'last_name': None, 'calls': 0 }
accounts = defaultdict(lambda: attributes)

问题在于我传递给defaultdict(属性)的默认字典是作为引用传递的。我如何将其作为值传递?以便更改一个键中的值不会更改其他键中的值。

例如 -

accounts[1]['calls'] = accounts[1]['calls'] + 1
accounts[2]['calls'] = accounts[2]['calls'] + 1
print accounts[1]['calls'] # prints 2
print accounts[2]['calls'] # prints 2

我希望每个人都打印1,因为我只增加了它们各自的“调用”值一次。

如果您需要复制,必须明确地进行复制。传递参数总是像传递引用一样。 - juanpa.arrivillaga
Python有且仅有一种求值策略:共享调用 - juanpa.arrivillaga
你会喜欢这个:https://dev59.com/52865IYBdhLWcg3wHK3u#3975388 - sangheestyle
2个回答

9

尝试:

accounts = defaultdict(attributes.copy)

自从Python 3.3以来,lists也有copy方法,因此您可以像上面使用defaultdict一样使用它,当您需要一个默认值为列表的字典时。请参考文档

1
是的!工厂可以是任何返回您想要用于缺失键的值的函数(只要它可以在不带参数的情况下调用),attributes.copy 就是这样一个函数! - kindall

3

我非常喜欢warvariuc提出的解决方案。但是需要记住,你没有将一个dict传递给defaultdict...否则会导致TypeError,因为该参数必须是可调用的。你可以在lambda中使用字面量,或者更好地,定义一个辅助函数:

>>> def attribute():
...     return { 'first_name': None, 'last_name': None, 'calls': 0 }
...
>>> accounts = defaultdict(attribute)
>>> accounts[1]['calls'] = accounts[1]['calls'] + 1
>>> accounts[2]['calls'] = accounts[2]['calls'] + 1
>>> print(accounts[1]['calls'])
1
>>> print(accounts[2]['calls'])
1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接