我使用的是Numpy v1.19。我发现一些ndarray
属性(如shape
和T
(的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
我不理解这一点,因为如果你定义了一个以ndarray
或tuple
为属性的类,那么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.shape
和ndarray.T
身上,而不会发生在A.tuple
身上?
第页。S.我注意到,如果它们被定义为@property
,那么这些事情就会发生。是吗?
它不是property
,但这些属性使用了C级等效的getset描述符。Getset描述符在属性访问上运行任意代码,就像属性一样,这些属性的Getset描述符构造新对象。