【发布时间】:2020-03-26 13:23:43
【问题描述】:
我对在 Python 中复制 Numpy 数组的工作方式感到困惑。我从以下内容开始:
import numpy as np
p = np.array([1.0, 0.0, 1.0, 0.3])
然后我尝试使用以下三种方法制作 p 的“副本”:
q = p
q1 = p[:]
q2 = p.copy()
现在我执行q1[2] = 0.2,然后检查q、q1和q2的值。我惊讶地发现 p、q 和 q1 都变成了array([1.0, 0.0, 0.2, 0.3]),而只有 q2 保持不变。我还使用id()检查了所有四个变量(p、q、q1、q2)的地址,并确认id(p) = id(q),但id(q1) != id(p)。
我的问题是,如果id(q1) != id(p),q1 的修改如何改变 p 和 q?谢谢!
【问题讨论】:
-
2 个具有唯一 ID 的对象仍然可以访问共享内存
-
@byxor 感谢您的快速回复!那么这个ID指的是什么?我以为 id(x) 会检查 x 的内存位置,不是吗?
-
[...][:]制作列表的(浅)副本,因为这是定义list.__getitem__的方式。np.array.__getitem__的定义不同。 -
@Xiao 正确。尽管没有什么可以阻止具有不同内存地址的 2 个对象修改 1 块共享内存。例如。如果一个类的 2 个实例包含对列表的引用,则这些实例将具有单独的 ID,但它们都将操作(列表的)相同的底层内存。
-
@byxor 我明白了。这很有帮助。谢谢!