numpy ndarray 属性的内部



我使用的是Numpy v1.19。我发现一些ndarray属性(如shapeT(的id在每次访问它们时都会发生变化。

例如,id(a.T)id(a.shape)在下面的代码中产生不同的值。

>>> import numpy as np
>>> a = np.array(range(12)).reshape(3, 4)
>>> id(a.T)
4510863728
>>> id(a.T)
4537092976
>>> id(a.T)
4514908240
>>> id(a.shape)
4542374664
>>> id(a.shape)
4542475656
>>> id(a.shape)
4542515336

我不理解这一点,因为如果你定义了一个以ndarraytuple为属性的类,那么id永远不会改变。例如:

>>> class A:
...     def __init__(self, tuple):
...         self.tuple = tuple
...
>>> a = A((0, 1, 2))
>>> id(a.tuple)
4339273800
>>> id(a.tuple)
4339273800
>>> id(a.tuple)
4339273800

为什么这些事情会发生在ndarray.shapendarray.T身上,而不会发生在A.tuple身上?

第页。S.我注意到,如果它们被定义为@property,那么这些事情就会发生。是吗?

它不是property,但这些属性使用了C级等效的getset描述符。Getset描述符在属性访问上运行任意代码,就像属性一样,这些属性的Getset描述符构造新对象。

最新更新