【问题标题】:Initializing Python dictionary using dict() vs {} [duplicate]使用 dict() vs {} 初始化 Python 字典 [重复]
【发布时间】:2016-06-04 20:33:53
【问题描述】:

我目睹了以下 Python 代码 sn-p 的一种非常奇怪的行为。

list_of_dict = [{}]*2                  # create a list of 2 dict
list_of_dict[0]["add_to_dict_0"] = 1   # add a (key,val) pair to 1st dict

print list_of_dict[0]
print list_of_dict[1]

输出是:

{'add_to_dict_0': 1}

{'add_to_dict_0': 1}

虽然我(明确地)只更新了一本,但两本词典都已更新。但是,将第 1 行中的初始化更改为以下内容:

list_of_dict = [dict() for _ in xrange(0,2)]

解决了这个问题。

这种行为的原因是什么?我猜这是 Python 中 name-object binding 概念的产物(与 C/C++ 等其他语言中的变量内存位置绑定相反)。我的猜测是,在第一种情况下,list_of_dict[0]list_of_dict[1] 都绑定到同一个字典对象。

我的怀疑正确吗?如果是,那么为什么在第二种情况下没有复制行为? dict_object = dict()dict_object = {}有什么区别?

【问题讨论】:

  • list_of_dict = [dict() for _ in xrange(0,2)]list_of_dict = [{} for _ in xrange(0,2)] 都有效。您的问题实际上与 dict(){} 无关。

标签: python variables dictionary reference


【解决方案1】:

dict_object = dict()dict_object = {}

没有区别

这里的问题是 [{}] * 2 将生成一个包含 2 个元素的列表,这些元素引用单个对象。 [{} for x in range(2)] 将生成一个包含两个元素的列表,这些元素引用两个不同的对象。

{} 替换为 dict() 将获得相同的结果。

【讨论】:

    【解决方案2】:

    列表中的字典都指向同一个对象,因此修改一个也会改变其他的

    >>> list_of_dict = [{}]*2
    >>> id(list_of_dict[0])
    50030176
    >>> id(list_of_dict[1])
    50030176
    

    当你使用dict()创建两个空字典时,dict()每次返回不同的对象

    >>> d1 = dict()
    >>> d2 = dict()
    >>> id(d1)
    50074656
    >>> id(d2)
    50074512
    

    【讨论】:

    • 这个答案看起来像是第二个例子中dict() 的选择是相关的。它不是。 d1 = {}d2 = {} 将与使用 dict() 产生相同的结果,它乘以 list 只包含一个 dict 导致问题。
    猜你喜欢
    • 2017-11-15
    • 2018-07-14
    • 2023-03-30
    • 2018-05-02
    • 2015-05-29
    • 1970-01-01
    • 2021-08-21
    • 2018-10-22
    • 2016-02-14
    相关资源
    最近更新 更多