下面:
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]
不同。
有人可以解释一下吗?谢谢。
答案 0 :(得分:2)
区别在于如何定义列表元素。在第一种情况下,您创建了两个词典的列表,但这些词典包含相同的引用,即它们指向相同的内存空间。当您执行a[0]['x'] = 1
您正在更改字典指向的数据时,由于列表中的两个字典都指向同一个空格,它们似乎都会更新。
在第二种情况下,你有一个两个数字的列表,这两个数字在技术上指向相同的位置(其中python预先分配为零)。当您执行a[0] = 1
时,您并未更改第一个元素所指向的空间中的数据,而是重置该元素指向的位置。具体来说,您将其重定向到1.这样只会更新第一个元素,但第二个元素仍然指向0。
答案 1 :(得分:1)
在第一个示例中,列表两个位置的引用都指向完全相同的字典。正确的方法是:
a = [{} for x in range(2)]
第二个例子不同:
a = [0] * 2
在列表中复制数字零,但如果您在包含它的某个位置重新分配值,则只需在给定索引上复制一个新数字。
关键点在于,在第一个示例中,字典是可变对象,而数字则不是,并且在第一个示例中,您执行了一个突变字典的操作,而在第二个例子,你刚刚重新分配了列表中的值。