Python变量值重置循环

时间:2013-05-25 18:52:04

标签: python

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

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,顺便说一句非常有趣),并且不允许导入任何东西。

1 个答案:

答案 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) ]