2016-06-12 24 views
0

你好!为什么我的二维数组的所有行都只有我传给它们中的一个的值?

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

会发生什么是在第一次迭代中,第一行取当前“vetor”的值。到目前为止很好,但在第二个循环中,“vetor”值被分配给第二个AND“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 
+0

我不知道我看到什么是递归的这个代码,因为没有定义的功能。也许你可以尝试用[编辑]来展示你的问题[mcve]? –

+0

它看起来像vetor已经是你想要的。为什么不只是复制vetor? – Craicerjack

+0

@Craicerjack,我实际上需要存储vetor的最后50个值,然后将它们写入文件。最好的选择是将它们存储在仅保留那些列表并丢弃第一个列表的列表中。发生特定事件后,存储在“matriz”中的值将被写入文件。 –

回答

0

当你有一个分配在C a = bmatriz[cnt]=vetor你的情况)/ C++的复制/ asignment构造函数被调用和对象的内容基本上是复制。无论a的类型是否为原始类型,如int/floatstruct/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是同一个对象(包括引用在记忆中)。

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

编辑:如果vetorlist一个简单的构造函数调用就可以了:list(vetor)

+0

我怀疑这样的事情,但我的C心态说:“不,它不能......”哈哈 –

+0

我用“new_vetor = list(vetor)”,并在新变量上工作以解决答案。 也许你可以编辑你的答案,突出这种可能性。 –

+0

我不知道'vetor'的类型,因为你的例子不是最小的运行示例。不知道vetor的类型,我不能说如何复制一般。 – Markus

相关问题