1

我在编程练习中编写了以下代码:

q = lenP[0]*[lenP[1]*[0.]] # empty 2D array
for i in range(lenP[0]):
    for j in range(lenP[1]):
        hit = (Z == colors[i][j])
        q[i][j] = (hit * sensor_right + (1-hit) * (1.-sensor_right)) * p[i][j]

如果我在循环内对其进行测试,则每个元素 q[i][j] 的值都是正确设置的。但是,如果我在循环之外打印任何 q[i][j],它就会恢复到其初始值 0。我想我在管理 python 对对象的引用时遗漏了一些东西,但那会是什么?

在正常设置中,我会使用 numpy 作为数组并完成它,但这是 Udacity 课程的代码(顺便说一下,机器人学的 IA,非常有趣)并且不允许导入任何内容。

4

1 回答 1

5

您的所有行之间都有共享。我最小化你的例子:

q = 2 * [ 2 * [0] ]
for i in range(2):
   for j in range(2):
       q[i][j] = (1-i) * j
       print(q)

您会看到每次我们重新定义同一行时:

[[0, 0], [0, 0]]
[[0, 1], [0, 1]]
[[0, 1], [0, 1]]
[[0, 0], [0, 0]]

好的版本是定义一个真正的矩阵而不通过使用共享

q = [ [ 0 for j in range(2) ] for i in range(2) ]

或任何其他保证行间独立性的成语。

当然,通过像这样的简单构造,您可以删除 for 循环:

q = [ [ (1-i) * j for j in range(2) ] for i in range(2) ]
于 2013-05-25T18:57:06.147 回答