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

时间:2017-02-07 19:09:33

标签: python dictionary hash pass-by-reference defaultdict

所以说我有一个字典,其默认值为另一个字典

{% for key in key_list %}
    <a href="{% url 'keysearch:index' %}?keys_selected={{ key.key }}${{ keys_selected }}" style="font-size: {{ key.count }}px;">({{ key.key }})</a>
{% empty %}
    <div class="w3-card-2 w3-black w3-center w3-rest"><h4>There are no key queries with this combination.</h4></div>
{% endfor %}

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

例如 -

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

我希望他们每个人都打印1,因为我只为'call'增加了他们各自的值一次。

2 个答案:

答案 0 :(得分:8)

尝试:

accounts = defaultdict(attributes.copy)

自Python 3.3 lists s also have copy method以来,当您需要一个以列表作为默认值的dict时,可以使用与defaultdict相同的方式使用它。

答案 1 :(得分:2)

我真的很喜欢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