列表中的Python运算符星号



为什么这里的输出是[[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)]

最新更新