您好!
我试图以递归方式运行以下代码,其中“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
答案 0 :(得分:0)
如果在c / c ++中有作业a = b
(matriz[cnt]=vetor
),则会调用copy / asignment构造函数,并且本质上会复制对象的内容。无论a
的类型是原始类型,如int
/ float
还是struct
/ class
(即std::vector<T>
)。
在python中,变量a
和b
是对象的引用,如c ++引用或c指针(但没有指针解引用语法)。
c程序员可能会认为修改a
不会更改b
,但在以下代码段中不是这种情况
a = [1, 2, 3]
b = a
a.append(42)
print(b)
将输出[1, 2, 3, 42]
,因为a
和b
都是对同一对象的引用(在内存中)。
要解决此问题,您需要在将vetor
分配给matriz[cnt]
之前明确复制vetor
。看看Shallow and deep copy operations。您可能需要深层复制。
修改:如果list
是list(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