我在编程练习中编写了以下代码:
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引用的管理,但那会是什么? / p>
在正常设置中,我会使用numpy作为数组并完成它,但这是一个Udacity课程的代码(IA for Robotics,顺便说一句非常有趣),并且不允许导入任何东西。
答案 0 :(得分: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) ]