擅长:python、mysql、java
<p>在CPython中,像<code>float</code>这样的简单类型的布局有三个字段:类型指针、引用计数和值(这里是<code>double</code>)。对于<code>list</code>,值是三个变量(指向单独分配的数组的指针、其容量和使用的大小)。这些类型不支持属性或弱引用以节省空间。你知道吗</p>
<p>如果一个Python类继承了其中的一个,那么它必须能够支持属性,而且没有固定的偏移量来放置<code>__dict__</code>指针(而不会因为将它放置在一个大的未使用偏移量而浪费内存)。所以字典存储在任何有空间的地方,它的偏移量(字节)是<a href="https://stackoverflow.com/a/46591145/8586227">recorded in the type</a>。对于大小可变的基类(如<code>tuple</code>,它直接包括它的所有指针),特别支持将<code>__dict__</code>指针存储在可变大小部分的末尾(<em>例如</em>,<code>type("",(tuple,),{}).__dictoffset__</code>是-8)。你知道吗</p>
<p>弱引用的情况是<a href="https://docs.python.org/3/extending/newtypes.html#weakref-support" rel="nofollow noreferrer">exactly analogous</a>,只是不支持可变大小类型的(子类)。0的<code>__weakrefoffset__</code>(这是C静态变量的默认值)表示不支持,因为对象的类型通常位于其布局的开头。你知道吗</p>