python - 为什么将一个变量的值分配给另一个变量会保存在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 保留在流程中?
解决方案
通过做
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)
推荐阅读
- ios - ESP8266 和 Arduino Uno 之间的串行通信一起发送/接收数据
- mypy - 为什么 mypy 不从 @overload 推断函数注释?
- laravel - Laravel API 条件关系
- java - 在 REDIS 缓存中/从 REDIS 缓存中保存/检索列表或记录
- javascript - 验证集成到 react.js 项目中
- android - 更新配置文件活动后,如何保持相同的活动并允许其他活动根据数据指向不同的活动?
- c# - 使用 C# 浏览器语言打开网站
- regex - 删除 .bat 文件中的一段文件名
- javascript - 如何使用节点 js 向 firebase 添加数据?
- node.js - NodeJS不正确的`console.log`日期值