python中将一个变量值赋给另一个变量且地址不同(A=B,且A和B地址不同)

  作为一个从matlab转到python的非计算机专业的小白,最近在写程序时遇到了一些坑,在这里分享一下。在python中对矩阵等变量给另一个变量赋值时(A=B),A中保存的是B中的地址。那么在哪些情况下保存的是地址、怎么做才能做到不是同地址的赋值呢?


1、非数组变量

  一般的在python中我们将变量a的值赋值给变量b,可以进行如下操作:

a = 1
b = a
b += 1
print( "a =" , a )
print( "b =" , b )

得到结果如下图所示:
在这里插入图片描述

从结果中可以看出,我改变b的值,并不会影响a。也就是说对于非数组、列表、字典等类型的变量,直接进行复制,变量b保存的不是地址。


2、矩阵

2.1 使用向量给向量进行赋值

   对向量进行赋值操作:

import  numpy as np
x = np.mat( '1 2 3' )
y = x
y[0] += 1
print( "x = " , x )
print( "y = " , y )

得到结果如下:

在这里插入图片描述

可以看出,改变y的第一个元素的值,x中对应元素值也随之改变,这说明这里保存的是地址。

2.2 使用矩阵给矩阵进行赋值

    使用矩阵对矩阵进行赋值:

import  numpy as np
x = np.mat( '1 2 3 ; 4 5 6' )
y = x
y[0 , 0] += 1
print( "x = \n" , x )
print( "y = \n" , y )

在这里插入图片描述

2.3 使用矩阵中的某一行(或某一列)赋值给一个向量

import  numpy as np
x = np.mat( '1 2 3 ; 4 5 6' )
y = x[ 0 , : ]
y[ 0 , 0 ] += 1

print( "x = \n" , x )
print( "y = \n" , y )

在这里插入图片描述

从结果可以看出,x中的第一行元素和y中元素地址是相同的。


3、解决方法

如果直接使用循环,先预定义一下y(既是随便给y生成一个和x相同规模的随机数),然后一个个元素进行赋值,是可以的。但是这种方法太不方便,并且很慢,python其实是可以直接实现不同地址的矩阵变量的赋值的。比如说,我们在需要将项量x的某一行乘上一个常数得到变量y的时候:

import  numpy as np
x = np.mat( '1 2 3 ')
y = 0.6 * x
y[ 0 , 0 ] += 1

print( "x = \n" , x )
print( "y = \n" , y )

这时候得到的结果,是不同地址的:
在这里插入图片描述

致此,可以用这种乘上系数1的方法,进行不同地址的赋值。

3.1 向量给向量赋值

import  numpy as np
x = np.mat( '1 2 3' )
y = 1 * x
y[0] += 1
print( "x = " , x )
print( "y = " , y )

结果:

在这里插入图片描述

3.2 矩阵给矩阵赋值

import  numpy as np
x = np.mat( '1 2 3 ; 4 5 6' )
y = 1 * x
y[0 , 0] += 1
print( "x = \n" , x )
print( "y = \n" , y )

结果:
在这里插入图片描述

3.3 矩阵的某一行(列)给向量赋值

import  numpy as np
x = np.mat( '1 2 3 ; 4 5 6' )
y = 1 * x[ 0 , : ]
y[ 0 , 0 ] += 1

print( "x = \n" , x )
print( "y = \n" , y )

结果:
在这里插入图片描述


4、其他情况的判断

  当然,上面说的这些情况可能不全,就比如说如下这种情况:

import  numpy as np
x = np.mat( '1 2 3 ; 4 5 6' )
y = np.mat( '7 8 9' )
x[ 0 , : ] = y
y[ 0 , 0 ] += 1

print( "x = \n" , x )
print( "y = \n" , y )

这里使用向量y给矩阵x中的第一行赋值,那么这种情况是否是两者地址相同呢?

在这里插入图片描述

这里的结果中可以看出,x和y的地址不同。那么就是说,将某个向量赋值给矩阵中的某一行或列的操作是非同地址的赋值;那么,也就是说可以通过每一行进行赋值,从而实现矩阵之间的赋值。当然,这里只是想说,对于没有提到的情况。如果在写code时抱有疑问,可以直接去试一试;但是,无论如何直接在矩阵或者向量面前乘上系数1后进行赋值,地址是不同的。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐