定义带有零的数组 a
后,我可以使用以下函数创建最左边列的 View :
a = np.zeros((5, 5))
a_left_col = a[:, 0]
a_left_col[:] = 2.
打印a
:
array([[2., 0., 0., 0., 0.],
[2., 0., 0., 0., 0.],
[2., 0., 0., 0., 0.],
[2., 0., 0., 0., 0.],
[2., 0., 0., 0., 0.]])
如果我随后重新初始化 a
a = np.zeros((5, 5))
那么 View 仍然存在,但它不再引用任何内容。如果我再次执行 a_left_col[:] = 2
,Python 如何处理这种情况?这种未定义的行为是否像 C 或 C++ 中那样,或者 Python 是否正确处理它?如果是,为什么它不抛出错误?
最佳答案
原始对象仍然存在,因为它被 View 引用。 (尽管不能再通过变量a
访问它。)
让我们详细看看对象的引用计数:
import sys
import numpy as np
a = np.zeros((5, 5))
print(sys.getrefcount(a)) # 2
a_left_col = a[:, 0]
print(sys.getrefcount(a)) # 3
print(sys.getrefcount(a_left_col.base)) # 3
print(a_left_col.base is a) # True
a = np.ones((5, 5))
print(sys.getrefcount(a_left_col.base)) # 2
请注意,a_left_col.base
是对原始数组的引用。当我们重新评估 a
时,对象的引用计数减少,但它仍然存在,因为它可以通过 a_left_col
访问。
关于python - 对不存在的数组使用 numpy View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48445577/