Python列表列表-访问单个元素

Python列表列表-访问单个元素,python,data-structures,Python,Data Structures,我试图在Python中访问列表列表的特定元素。我带了一点C/Java的包袱,把这个数据结构看作一个2D数组。在我看来,下面的操作应该只影响第一个列表的第一项,即Java speak中的loc1[0][0]。实际上,每个子列表的第一项都会受到影响,即loc1[0][0]、loc1[1][0]和loc1[2][0]。知道为什么吗 def move(loc, dir, nrows, ncols): loc1 = [[0.0] * ncols] * nrows for col in range

我试图在Python中访问列表列表的特定元素。我带了一点C/Java的包袱,把这个数据结构看作一个2D数组。在我看来,下面的操作应该只影响第一个列表的第一项,即Java speak中的loc1[0][0]。实际上,每个子列表的第一项都会受到影响,即loc1[0][0]、loc1[1][0]和loc1[2][0]。知道为什么吗

def move(loc, dir, nrows, ncols):
  loc1 = [[0.0] * ncols] * nrows

  for col in range(1):
      for row in range(1):
          loc1[row][col] += 100.0 * loc[row][col]

  return loc1
nrows = 4
ncols = 3
p = [[1.0 / (ncols * nrows)] * ncols] * nrows #uniform prior

print p
p = move(p, [0, 1], nrows, ncols)
print p

我以前也有过这种情况,这很令人沮丧

您的问题在于这一行代码,它没有做您认为它是:

loc1 = [[0.0] * ncols] * nrows
[0.0]*ncols创建单个列表,通过引用传递该列表以形成2D列表

试试这个:

loc1 = [[0.0 for y in range(ncols)] for x in range(nrows)]
[x] *n生成一个包含n次完全相同的x元素的列表

L=[0.0]*ncols之所以有效,是因为0.0是一个浮点数,并且浮点数在Python中是不可变的,因此L[0]+=1.1不会更改0.0,而是将1.1放在它的位置

因此,当您更改L=[[0]*ncol]*N中的任何行时,列表是可变的,因为它是同一个对象,所以您可以更改所有行

要解决此问题,您可以:

L = [[0.0]*ncols for _ in xrange(nrows)]
它会为每一行创建一个新列表,以便您可以单独更改它们

或:


什么对你来说更可读。

我有时想知道是谁设计了这个。谢谢,它工作了,将在7分钟内接受。@reset:anythingandeverythings在Python中通过引用传递。假设[x]*n将x项复制n次。如何在任意对象上定义复制操作?是浅拷贝还是深拷贝?您是否将操作仅限于可pickle的对象?我们可能有几十个有效的问题副本,但我不知道如何有效地搜索它们:
from itertools import repeat

L = [[0.0]*ncols for _ in repeat(None, nrows)]