python初始化一个dict列表可能只是复制引用

时间:2016-04-15 02:22:17

标签: python list dictionary

下面:

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

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

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

会显示[1, 0]a[0]a[1]不同。

有人可以解释一下吗?谢谢。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

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

第二个例子不同:

a = [0] * 2

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

关键点在于,在第一个示例中,字典是可变对象,而数字则不是,并且在第一个示例中,您执行了一个突变字典的操作,而在第二个例子,你刚刚重新分配了列表中的值。