为什么我的2d数组的所有行都采用我传递给它们中的一个的值?

时间:2016-06-12 17:43:38

标签: python arrays

您好!

我试图以递归方式运行以下代码,其中“vetor”是几个变量的当前状态,我将前50个存储在“matriz”中,这是一个包含50行和10列的2d数组。一切都初始化为零。

在第一次迭代中,第一行采用当前“vetor”的值。到目前为止一直很好,但是在第二个循环中,“vetor”值被分配给“matriz”的第二行和第一行。例如,在最后一次迭代中,所有“matriz”行都等于“vetor”的最后一行。

我学习控制工程,主要用C或MATLAB编程,所以我是Python的新手......

下面是所描述代码的一部分,我相信问题所在。

            #armazena as variáveis do estado
            vetor[0]=sc.get_ball_distance()
            vetor[1]=sc.get_ball_angle()
            vetor[2]=sc.get_target_angle()
            vetor[3]=sc.get_obstacle_distance()
            vetor[4]=sc.get_obstacle_angle()
            vetor[5]=sc.get_spin()
            vetor[6]=force_left_anterior
            vetor[7]=force_right_anterior
            vetor[8]=force_left
            vetor[9]=force_right

            #armazena o vetor de estado como linha na matriz
            if cnt<50:      
                    matriz[cnt]=vetor
                    cnt=cnt+1

1 个答案:

答案 0 :(得分:0)

如果在c / c ++中有作业a = bmatriz[cnt]=vetor),则会调用copy / asignment构造函数,并且本质上会复制对象的内容。无论a的类型是原始类型,如int / float还是struct / class(即std::vector<T>)。

在python中,变量ab是对象的引用,如c ++引用或c指针(但没有指针解引用语法)。

c程序员可能会认为修改a不会更改b,但在以下代码段中不是这种情况

a = [1, 2, 3]
b = a
a.append(42)
print(b)

将输出[1, 2, 3, 42],因为ab都是对同一对象的引用(在内存中)。

要解决此问题,您需要在将vetor分配给matriz[cnt]之前明确复制vetor。看看Shallow and deep copy operations。您可能需要深层复制。

修改:如果listlist(vetor),那么简单的构造函数调用就可以解决问题:foo: gcc foo.c -o foo mv foo ~/bin bar: gcc bar.c -o bar mv bar ~/bin baz: gcc baz.c -o baz mv baz ~/bin