为什么在python中将一个变量的值赋给另一个变量会保存在内存中?
我是python新手,以前使用过Matlab,对python中的变量有些困惑 我正试图用python重写一个Matlab代码,这就是混淆的地方。假设我有以下情况:为什么在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 >>> >
>>> 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)