<blockquote>
<p>Why <code>28</code> bytes initially for any value as low as <code>1</code>?</p>
</blockquote>
<p>我完全相信<a href="https://stackoverflow.com/a/40344291/4952130">@bgusach answered that</a>;Python使用<code>C</code>结构来表示Python世界中的对象,任何对象<a href="https://github.com/python/cpython/blob/c30098c8c6014f3340a369a31df9c74bdbacc269/Include/longintrepr.h#L85" rel="nofollow noreferrer">including ^{<cd2>}s</a>:</p>
<pre class="lang-c prettyprint-override"><code>struct _longobject {
PyObject_VAR_HEAD
digit ob_digit[1];
};
</code></pre>
<p><a href="https://docs.python.org/3/c-api/structures.html#c.PyObject_VAR_HEAD" rel="nofollow noreferrer">^{<cd3>}</a>是一个宏,它在展开时在结构中添加另一个字段(字段<a href="https://docs.python.org/3/c-api/structures.html#c.PyVarObject" rel="nofollow noreferrer">^{<cd4>}</a>,它专门用于具有某种长度概念的对象),并且,<a href="https://github.com/python/cpython/blob/fda4d710b0af74e1cf04108ed014e4eb42e84534/Include/longintrepr.h#L87" rel="nofollow noreferrer">^{<cd5>}</a>是一个保存数字值的数组。Boiler-plate的大小来自于这个结构,对于小的<em>和</em>大的Python数。在</p>
<blockquote>
<p>Why increments of <code>4</code> bytes?</p>
</blockquote>
<p>因为,当创建一个更大的数字时,大小(以字节为单位)是<code>sizeof(digit)</code>的倍数;在<a href="https://github.com/python/cpython/blob/fda4d710b0af74e1cf04108ed014e4eb42e84534/Objects/longobject.c#L183" rel="nofollow noreferrer">^{<cd7>}</a>中,为新的{<cd8>}分配内存是用<code>PyObject_MALLOC</code>执行的:</p>
^{pr2}$
<p><sup><code>offsetof(PyLongObject, ob_digit)</code>是与保持其值无关的长对象的“boiler plate”(字节)。</sup></p>
<p>在包含<code>struct _longobject</code>的头文件中,<code>digit</code>被定义为<code>uint32</code>的<code>typedef</code>:</p>
<pre><code>typedef uint32_t digit;
</code></pre>
<p>而<code>sizeof(uint32_t)</code>是<code>4</code>字节。这就是当<code>_PyLong_New</code>的<code>size</code>参数增加时,以字节为单位的大小增加的量。在</p>
<hr/>
<p>当然,这正是<code>C</code>Python选择实现它的方式。这是一个实现细节,因此您不会在政治公众人物中找到太多信息。如果可以找到对应的线程:-),python dev邮件列表将举行实现讨论。在</p>
<p>不管怎样,您可能会在其他流行的实现中发现不同的行为,所以不要认为这是理所当然的。在</p>