python - 为什么在Python中将一个变量的值分配给另一个变量会保存在内存中?

标签 python matlab

我是 python 新手,以前使用过 Matlab,对 python 中的变量有一些困惑。

我正在尝试用 python 重写 Matlab 代码,这就是发生困惑的地方。假设我有以下情况:

>>> A = np.array([[1,2,3],[4,5,6]])
>>> out = np.array([[True, False, True],[False, True, False]])
>>> 
>>> B = A
>>> 
>>> B[out] = A[out]+1
>>> 
>>> B
array([[2, 2, 4],
       [4, 6, 6]])
>>> A    
array([[2, 2, 4],
       [4, 6, 6]])

在 Matlab 中,同一段代码 A 不会改变,但在 python 中却会改变。任何人都可以解释为什么以及避免 A 发生变化的最佳方法是什么?

代码图像:why assigning A to B is kept in the flow?

最佳答案

通过做

B = A

您正在创建对同一对象A的另一个引用,因此A引起的所有更改都将自动反射(reflect)在B中。在这种情况下复制列表/数组的正确(几种)方法

B = A[::]

B = A.copy()

通过这种方式,您可以将元素复制到列表变量中,无需创建指向原始变量A的指针,从而将它们与软内存地址解耦。

正如 Jon Clements 所指出的,

[::] 表示开始,以步长 1 结束,表示 [0:len(obj):1][:] 表示 [:len(obj)],其中 obj 是您的对象。

正如下面@Patrick所指出的,如果你A是一个numpy矩阵,你也可以这样做

 B = np.copy(A)

关于python - 为什么在Python中将一个变量的值分配给另一个变量会保存在内存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54025870/

相关文章:

python - 为什么我的排序代码执行时间不一致?

python - 在 Python 中一行不超过 80 个字符是什么意思?

python - 在 sqlalchemy ORM 查询中使用 NOT EXISTS 子句

matlab - 在 MATLAB 中,是否可以在创建新对象之前检查对象是否已存在?

excel - 如何在 MATLAB 中从 xlsread 读取文本值?

matlab - 区分居中和缩放的 Polyfit 拟合

python - PyCrypto 安装错误(无论如何 vc\cl.exe 都会失败)

python - 有没有办法将我的 python 发行版设为 "version"?

matlab - 使用 Matlab 在二值图中查找凹度像素/点

matlab - 使用MATLAB的conv2函数如何执行完全卷积?