Python二维数组 - 更改元素

Jok*_*ker 13 python arrays

我有这个7x7二维数组:

l=[[1, 1, 1, 1, 1, 1, 1],
  [1, 0, 2, 0, 0, 0, 1],
  [1, 0, 0, 0, 0, 0, 1],
  [1, 0, 0, 0, 0, 0, 1],
  [1, 0, 0, 0, 0, 0, 1],
  [1, 0, 0, 0, 0, 0, 1],
  [1, 1, 1, 1, 1, 1, 1]]
Run Code Online (Sandbox Code Playgroud)

如您所见,l [1] [2] = 2.当我打印它时,元素被正确打印.这里没问题.但是当我尝试将其从"2"更改为"3"或任何其他数字时,程序会更改该列上的所有元素(在本例中为第3列),但第一列和最后一列除外.例如,如果我输入以下代码:

l[1][2]=5
Run Code Online (Sandbox Code Playgroud)

然后打印二维数组,我得到这个:

l=[[1, 1, 1, 1, 1, 1, 1],
  [1, 0, 5, 0, 0, 0, 1],
  [1, 0, 5, 0, 0, 0, 1],
  [1, 0, 5, 0, 0, 0, 1],
  [1, 0, 5, 0, 0, 0, 1],
  [1, 0, 5, 0, 0, 0, 1],
  [1, 1, 1, 1, 1, 1, 1]]
Run Code Online (Sandbox Code Playgroud)

我选择的每个元素都会发生这种情况.它不是仅更改该元素,而是更改整个列.有谁知道可能是什么问题?谢谢!

mgi*_*son 29

即使您描述的行为(正如您所描述的那样)是不可能的,我也会对此进行攻击.

如果创建列表,则需要确保每个子列表都是不同的列表.考虑:

a = []
b = [a, a]
Run Code Online (Sandbox Code Playgroud)

在这里,我创建了一个列表,其中两个子列表都是完全相同的列表.如果我改变一个,它将出现在两者中.例如:

>>> a = []
>>> b = [a, a]
>>> b[0].append(1)
>>> b
[[1], [1]]
Run Code Online (Sandbox Code Playgroud)

您将经常使用*运算符初始化列表来看到此行为:

a = [[None]*7]*7
Run Code Online (Sandbox Code Playgroud)

例如

>>> a = [[None]*7]*7
>>> a
[[None, None, None, None, None, None, None], [None, None, None, None, None, None, None], [None, None, None, None, None, None, None], [None, None, None, None, None, None, None], [None, None, None, None, None, None, None], [None, None, None, None, None, None, None], [None, None, None, None, None, None, None]]
>>> a[0][1] = 3
>>> a
[[None, 3, None, None, None, None, None], [None, 3, None, None, None, None, None], [None, 3, None, None, None, None, None], [None, 3, None, None, None, None, None], [None, 3, None, None, None, None, None], [None, 3, None, None, None, None, None], [None, 3, None, None, None, None, None]]
Run Code Online (Sandbox Code Playgroud)

修复是不使用*外部列表上的7(内部列表是好的,因为None是不可变的):

a = [[None]*7 for _ in range(7)]
Run Code Online (Sandbox Code Playgroud)

例如:

>>> a = [[None]*7 for _ in range(7)]
>>> a[0][1] = 3
>>> a
[[None, 3, None, None, None, None, None], [None, None, None, None, None, None, None], [None, None, None, None, None, None, None], [None, None, None, None, None, None, None], [None, None, None, None, None, None, None], [None, None, None, None, None, None, None], [None, None, None, None, None, None, None]]
Run Code Online (Sandbox Code Playgroud)