Python二维查询
我在使用Python的时候遇到了一些很奇怪的情况,请告诉我我哪里做错了!
bc = [[0]*(n+1)]*(n+1)
for i in range(n+1):
bc[i][i] = 1
print (bc)
输出结果
[[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]
我想把一个二维数组的对角线元素初始化为1,但结果是所有元素都被初始化为1。我觉得我在访问这个二维数组的时候出了问题。
另外,请告诉我怎么用两个循环来访问这个二维数组的所有元素,这是我接下来的步骤。
谢谢!
3 个回答
0
试试这个:
bc = [[0 for i in range(n+1)] for j in range(n+1)]
在你的例子中,只有一个 [0]
的实例,但它被多次引用。所以如果你改变了这个实例,所有引用它的地方都会跟着改变。
3
问题在于你数组里的每一个数组其实都是在内存中指向同一个数组。你每次都需要创建一个新的数组。比如说,使用 [[0]]*6 这样的方法,会在一个数组里创建6个相同的数组,修改其中一个数组会导致其他的也被更新。
例如:
>>> x=[1]
>>> y=x
>>> x.append(3)
>>> x
[1, 3]
>>> y
[1, 3]
>>> z=[x]*3
>>> x.append(6)
>>> z
[[1, 3, 4, 6], [1, 3, 4, 6], [1, 3, 4, 6]]
这里有个解决办法,就是把 bc 改成 n+1 个不同的数组:
n=4
bc = [[0]*(n+1) for i in range(n+1)]
for i in range(n+1):
bc[i][i] = 1
print (bc)
[[1, 0, 0, 0, 0], [0, 1, 0, 0, 0], [0, 0, 1, 0, 0], [0, 0, 0, 1, 0], [0, 0, 0, 0, 1]]
6
你的数组初始化得不对。正确的方式来初始化一个二维数组是这样的:
bc = [[0 for i in xrange(n + 1)] for i in xrange(n + 1)]
这是一个常见的错误,* 操作符是复制指向列表的指针,而不是复制整个列表。所以虽然看起来你有一个二维列表,其实你只是有一个指向同一个列表的指针的一维列表。