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

为什么在python中将一个变量的值赋给另一个变量会保存在内存中?,python,matlab,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 >>> >

我是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中会改变。任何人都可以解释为什么,以及什么是避免变更的最佳方式

代码图像:

通过执行

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

B = A[::]

通过这种方式,您可以将元素复制到列表变量,而不创建指向原始变量
a
的指针,从而根据内存地址将它们解耦

正如他所指出的,

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

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

 B = np.copy(A)

欢迎来到Stack Overflow。它很难阅读,阻止了基于文本的搜索,并降低了文章的整体呈现价值@Kevin通过“内联”图像来帮助ppl并没有真正提高帖子的质量。在Python中,当您有一个复杂的结构,如分配给
a
的数组时,
a
实际上持有一个指向数据的引用(指针)。当您写入
B=A
时,这是将变量的“引用”指定给
B
A
B
都指向同一个数组。请看,请看并阅读以下内容:@PatrickArtner:我刚刚尝试过,但似乎两者都做了相同的事情,即创建一个没有标签的副本reference@PatrickArtner它与
[:]
相同。。。只是
[::]
转换为开始,结束时步长为1。。。所以
[:]
[:len(obj)]
一样,
[:]
[0:len(obj):1]
一样…@JonClements:如果我没有错的话,
[:]
基本上也采用默认的步长1。是的。。。只是语法。。。所以无论是
还是
都足以使一切都成为默认值。。。在野外看到
::
是很奇怪的…)@容克莱门茨:让我把你的建议和评论写在我的回答中,让它更详细。谢谢你的话
 B = np.copy(A)