为什么我的2d数组的所有行只接受我传递给其中一行的值?

2024-04-23 20:42:29 发布

您现在位置:Python中文网/ 问答频道 /正文

你好!你知道吗

我尝试递归地运行以下代码,其中“vetor”是几个变量的当前状态,我将前50个存储在“matriz”中,这是一个包含50行和10列的二维数组。一切都初始化为零。你知道吗

在第一次迭代中,第一行取当前“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

Tags: 代码getleftdistancescforcecntangle
1条回答
网友
1楼 · 发布于 2024-04-23 20:42:29

当您在c/c++中有赋值a = bmatriz[cnt]=vetor在您的例子中)时,将调用copy/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都是对同一对象(内存中)的引用。你知道吗

要解决这个问题,您需要显式复制vetor,然后再将其分配给matriz[cnt]。看看Shallow and deep copy operations。深度复制可能是您所需要的。你知道吗

编辑:如果vetor是一个list,一个简单的构造函数调用就可以做到:list(vetor)

相关问题 更多 >