Python二维查询

1 投票
3 回答
1447 浏览
提问于 2025-04-16 22:36

我在使用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)]

这是一个常见的错误,* 操作符是复制指向列表的指针,而不是复制整个列表。所以虽然看起来你有一个二维列表,其实你只是有一个指向同一个列表的指针的一维列表。

撰写回答