我是 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 发生变化的最佳方法是什么?
最佳答案
通过做
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/