首页 > 解决方案 > 为什么将一个变量的值分配给另一个变量会保存在python的内存中?

问题描述

我是 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 的最佳方法是什么?

代码图像:为什么将 A 分配给 B 保留在流程中?

标签: pythonmatlab

解决方案


通过做

B = A

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

B = A[::]

或者

B = A.copy()

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

正如Jon Clements所指出的,

[::]表示开始,以 1 的步长结束,这意味着[0:len(obj):1][:]表示你的对象[:len(obj)]在哪里。obj

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

 B = np.copy(A)

推荐阅读