【发布时间】:2021-01-16 19:03:22
【问题描述】:
我对 numpy 中的所有权机制感到困惑。
import numpy as np
a = np.arange(10)
a.flags.owndata # True
id(a) # 140289740187168
前四行很明显,变量a拥有id为140289740187168的数据。
b = a
c = a.view()
d = a.reshape((2, 5))
print(b.flags.owndata, b.base, id(b.base)) # True None 94817978163056
print(c.flags.owndata, c.base, id(c.base)) # False [0 1 2 3 4 5 6 7 8 9] 140289740187168
print(d.flags.owndata, d.base, id(d.base)) # False [0 1 2 3 4 5 6 7 8 9] 140289740187168
id(None) # 94817978163056
变量c,d 都是来自a 的“浅”副本,因此两者都没有自己的数据。 b 是 a 并拥有数据(与 a 共享)。
a = a.view()
print(id(a)) # 140289747003632
print(a.flags.owndata, a.base, id(a.base)) # False [0 1 2 3 4 5 6 7 8 9] 140289740187168
但是,将a 的视图分配给a 会创建一个ID 为140289747003632 的新变量,并将数据所有权留给ID 为140289740187168 的旧a。
问题是,由于旧的a 已被新的a 超载,将数据所有权转移给新的a 会更合理。为什么旧的a 仍然保留数据所有权?
【问题讨论】:
标签: python numpy ownership shallow-copy