Python - 如何将字典作为值而不是引用传递给 defaultdict
Python - how to pass a dictionary into defaultdict as value and not as a reference
假设我有一个字典,默认值是另一个字典
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,因为我只为 'calls' 增加了它们各自的值一次。
尝试:
accounts = defaultdict(attributes.copy)
Since Python 3.3 lists
s also have copy
method 所以当你需要一个带有列表的字典时,你可以像上面一样使用 defaultdict
s默认值。
我非常喜欢 warvariuc 的解决方案。但是,请记住,您不会将 dict
传递给 defaultdict
... 这会导致 TypeError
,因为该参数必须是 callable.您可能只是在 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
假设我有一个字典,默认值是另一个字典
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,因为我只为 'calls' 增加了它们各自的值一次。
尝试:
accounts = defaultdict(attributes.copy)
Since Python 3.3 lists
s also have copy
method 所以当你需要一个带有列表的字典时,你可以像上面一样使用 defaultdict
s默认值。
我非常喜欢 warvariuc 的解决方案。但是,请记住,您不会将 dict
传递给 defaultdict
... 这会导致 TypeError
,因为该参数必须是 callable.您可能只是在 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