Python:避免指向同一元素的子列表

时间:2013-03-20 14:41:29

标签: python list reference

在Python中,我希望list包含[0,0]形式的给定数量的子列表。例如:

>>> myLen = 2
>>> myList = [[0,0]] * myLen
>>> myList
[[0, 0], [0, 0]]

事实证明,每个子列表始终指向同一个元素,因此修改一个元素会自动修改另一个元素。

>>> myList[0][0] = 2
>>> myList
[[2, 0], [2, 0]]

为什么?我该如何避免这种行为?

2 个答案:

答案 0 :(得分:2)

使用列表理解:

myList = [[0,0] for _ in range(myLen)]

创建单独的子列表。

当您将列表相乘时,不会复制内部列表,只会复制对子列表的引用。你基本上这样做:

myList = [[0,0]]
for _ in range(myLen - 1):
    myList.append(myList[0])

另一方面,列表推导执行表达式,为每个循环迭代创建子列表,因此在每次运行时都会创建一个全新的列表:

myList = []
for _ in range(myLen):
    myList.append([0,0])

答案 1 :(得分:0)

也许你可以使用numpy:

import numpy
matrix = numpy.zeros(myLen, 2)

来源:http://docs.scipy.org/doc/numpy/reference/generated/numpy.zeros.html