【问题标题】:python initialize a list of dict likely just copy reference [duplicate]python初始化一个dict列表可能只是复制引用[重复]
【发布时间】:2016-04-15 02:22:16
【问题描述】:

这里:

a = [{}] * 2
a[0]['x'] = 1
print a

将显示a是[{'x': 1}, {'x': 1}],可能python只是复制引用,a[1]指的是a[0]

a = [0] * 2
a[0] = 1
print a

将显示 a 是 [1, 0]a[0]a[1] 是不同的。

谁能解释一下?谢谢。

【问题讨论】:

    标签: python list dictionary


    【解决方案1】:

    不同之处在于列表元素的定义方式。在第一种情况下,您创建了一个包含两个字典的列表,但这些字典包含相同的引用,即它们指向相同的内存空间。当您执行 a[0]['x'] = 1 时,您正在更改字典指向的数据,并且由于列表中的两个字典都指向同一个空间,它们似乎都在更新。

    在第二种情况下,您有一个包含两个数字的列表,从技术上讲,这两个数字都指向同一个位置(python 预先分配了零)。当您执行a[0] = 1 时,您不会更改第一个元素指向的空间中的数据,而是重置该元素指向的位置。具体来说,您将其重定向到 1。这样只有第一个元素更新,但第二个元素仍指向 0。

    【讨论】:

      【解决方案2】:

      在第一个示例中,列表两个位置的引用都指向完全相同的字典。正确的做法是:

      a = [{} for x in range(2)]
      

      第二个例子不同:

      a = [0] * 2
      

      数字零被复制到整个列表中,但如果您在包含它的位置之一上重新分配值,您只需在给定索引上复制一个新数字。

      关键在于,在第一个示例中,字典是一个 可变 对象,而数字不是,此外,在第一个示例中,您执行了一个改变字典的操作,而在第二个示例,您刚刚重新分配了列表中的值。

      【讨论】:

        猜你喜欢
        • 2011-12-26
        • 2012-09-29
        • 2016-06-04
        • 1970-01-01
        • 2011-10-11
        • 2012-11-21
        • 1970-01-01
        • 2011-05-11
        • 1970-01-01
        相关资源
        最近更新 更多