擅长:python、mysql、java
<p>嗯,<code>range</code>试图构建一个<strong>完整的</strong>列表,其中包含尽可能多的项<code>x</code>。你知道吗</p>
<p>对于死亡的即时交换,假设64位和一个固定的8字节整数,<code>x = 10**9</code>大约值8go。因此,如果您没有超过这一点(考虑到已经使用的RAM),您可以看到为什么系统交换。你知道吗</p>
<p>再往下看,如果函数不能分配足够大的块来保存结果(在<code>10**15</code>的情况下,这个块看起来相当大),那么<code>MemoryError</code>可能会被引发。你知道吗</p>
<p><s>我不知道<code>range</code>的实现细节,但它可能使用<code>OverflowError</code>来确保元素的绝对最大数量(可能是为了防止<code>MemoryError</code>,基于实际可用内存)。</s><br/>
正如@ShadowRanger在注释中提到的,如果结果的长度不能放入<code>size_t</code>变量(<code>2**31</code>(32位)或<code>2**63</code>(64位))中,则会引发<code>OverflowError</code>,因为它无法初始化这样的列表。你知道吗</p>
<p>正如您所提到的,xrange没有这个问题,因为它不会生成整个列表,而是在每次迭代时生成一个值。这就是迭代器/生成器具有内存效率的原因。你知道吗</p>
<hr/>
<p>所以我快速看了一下,你可以看到为什么它抛出一个<code>OverflowError</code>。你知道吗</p>