title: The internal of numpy ndarray's attributes
body: <p>I'm using Numpy v1.19. I found that <code>id</code> of some of the <code>ndarray</code> attributes, such as <code>shape</code> and <code>T</code>, vary every time I access them.</p>
  <p>For example, <code>id(a.T)</code> and <code>id(a.shape)</code> results in different values in the code below.</p>
  <pre><code>&gt;&gt;&gt; import numpy as np
  &gt;&gt;&gt; a = np.array(range(12)).reshape(3, 4)
  &gt;&gt;&gt; id(a.T)
  4510863728
  &gt;&gt;&gt; id(a.T)
  4537092976
  &gt;&gt;&gt; id(a.T)
  4514908240
  &gt;&gt;&gt; id(a.shape)
  4542374664
  &gt;&gt;&gt; id(a.shape)
  4542475656
  &gt;&gt;&gt; id(a.shape)
  4542515336
  </code></pre>
  <p>I don't understand this, because if you define a class which has a <code>ndarray</code> or <code>tuple</code> as its attribute, the <code>id</code> will never change. For example:</p>
  <pre><code>&gt;&gt;&gt; class A:
  ...     def __init__(self, tuple):
  ...         self.tuple = tuple
  ...
  &gt;&gt;&gt; a = A((0, 1, 2))
  &gt;&gt;&gt; id(a.tuple)
  4339273800
  &gt;&gt;&gt; id(a.tuple)
  4339273800
  &gt;&gt;&gt; id(a.tuple)
  4339273800
  </code></pre>
  <p>Why those things happen to <code>ndarray.shape</code> and <code>ndarray.T</code>, and not to <code>A.tuple</code>?</p>
  <p>P.S. I've noticed those things can happen if they are defined as <code>@property</code>. Are they?</p>