我有这个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)
| 归档时间: |
|
| 查看次数: |
15785 次 |
| 最近记录: |