为什么这里的输出是[[2,1],[2,1]]而不是[[2,1],[1,1]
a = [[1] * 2] * 2
a[0][0]=2
print (a)
我对列表中的*运算符做了大量的研究,但它似乎没有让我正确理解
这是由于Python如何处理内存中的对象。当您使用* 2
复制列表时,Python不会在内存中创建单独的列表对象,它只复制第二个列表位置的内存指针。由于这种行为,当你突变第一个元素时,它也会影响第二个元素。您可以使用id()
函数来检查Python中的对象id。您将看到a[0]
和a[1]
将具有相同的id。
>>> a = [[1] * 2] * 2
>>> a[0][0] = 2
>>> a
[[2, 1], [2, 1]]
>>> id(a[0])
140608840898432
>>> id(a[1])
140608840898432
>>> id(a[0]) == id(a[1])
True
当您这样做时,您只需要创建列表的副本,n次。
所以这里的内部列表实际上是相同的列表。当您修改第一个时,您也在修改第二个。如果你不想要这个功能,你可以这样做:
a = [[1 for _ in range(2)] for _ in range(2)]