<p>要回答您的问题,没有直接的等价物,您通常会发现在所谓的“函数式”语言(lisp、OCaml、Haskell等)中的缺点</p>
<p>这是因为在编程语言中有两个相互竞争的模型来表示元素列表。</p>
<h2>链接列表</h2>
<p>你似乎很熟悉的那个叫做链表。</p>
<p>链接列表由cons单元格组成,每个单元格包含两个引用:</p>
<ul>
<li>第一个指向列表元素,称为<strong>head</strong></li>
<li>另一个指向列表中的下一个cons单元格,是<strong>尾部</strong></li>
</ul>
<p>由于列表很少是无限的,最后一个常量单元格通常指向一个特殊的值,即空列表,有时称为<em>nil</em>。</p>
<p>如果您想将列表保存在变量中以备将来参考,您可以保留对第一个cons单元格的参考。</p>
<p><a href="https://upload.wikimedia.org/wikipedia/commons/1/1b/Cons-cells.svg" rel="noreferrer">Here's a visual representation from Wikipedia</a>。</p>
<p>在这个模型中,每个列表都必须通过创建一个新的cons单元来将元素添加到前面来构造,该单元指向新元素作为其头部,指向先前构造的子列表作为其尾部。这就是cons运算符有时被称为<em>列表构造函数</em>的原因。</p>
<h2>数组</h2>
<p>这是Python等命令式语言通常首选的模型。在这个模型中,列表只是对内存中某个范围的引用。</p>
<p>假设您创建了一个这样的列表:</p>
<pre><code>l = [1, 2, 3]
</code></pre>
<p>每当您创建一个列表时,Python都会给它分配一个小范围的内存来存储元素,并为您以后添加元素提供一点额外的空间。要存储它,只需存储对第一个元素和内存范围大小的引用,如下所示:</p>
<pre><code>l <-- your variable
| ___ ___ ___ ___ ___ ___ ___ ___ ___
|-> | | | | | | | | | |
| 1 | 2 | 3 | | | | | | |
|___|___|___|___|___|___|___|___|___|
</code></pre>
<p>如果决定在列表末尾添加元素,可以使用<code>append</code></p>
<pre><code>l.append(4)
</code></pre>
<p>结果如下:</p>
<pre><code> ___ ___ ___ ___ ___ ___ ___ ___ ___
| | | | | | | | | |
| 1 | 2 | 3 | 4 | | | | | |
|___|___|___|___|___|___|___|___|___|
</code></pre>
<p>现在,假设您忘记了首字母0,现在希望将其添加到前面。您可以很好地使用insert方法(插入位置为0):</p>
<pre><code>l.insert(0, 0)
</code></pre>
<p>但是列表的开头没有空格!Python别无选择,只能获取每个元素,并在直接右边的位置一次复制它们:</p>
<pre><code> ___ ___ ___ ___ ___ ___ ___ ___ ___
| | | | | | | | | |
| 1 | 2 | 3 | 4 | | | | | |
|___|___|___|___|___|___|___|___|___|
| | |__ |___
| |___ | | First, Python has to copy the four elements
|___ | | | one space to the right
___ _\/ _\/ \/_ _\/ ___ ___ ___ ___
| | | | | | | | | |
| | 1 | 2 | 3 | 4 | | | | |
|___|___|___|___|___|___|___|___|___|
Only then can it insert the 0 at the beginning
___ ___ ___ ___ ___ ___ ___ ___ ___
| | | | | | | | | |
| 0 | 1 | 2 | 3 | | | | | |
|___|___|___|___|___|___|___|___|___|
</code></pre>
<p>对于这样一个小的数组来说,这似乎不算什么,但是想象一下,您的数组要大得多,并且您多次重复此操作:您将花费大量时间构建列表!</p>
<p>这就是为什么在使用数组(如Python)的语言中找不到列表构造函数。</p>
<h2>进一步跳水:为什么两种不同的模式?</h2>
<p>您现在可能想知道,为什么不同的语言更喜欢不同的列表模型,以及这两种模型中是否有一种更优秀。</p>
<p>这是因为这两种数据结构在不同的上下文中有不同的性能。两个例子:</p>
<h2>访问中间的元素</h2>
<p>假设您想要得到列表的第五个元素。</p>
<p>在链接列表中,您需要获得:</p>
<ul>
<li>第一个囚室</li>
<li>然后这个细胞的尾部得到第二个元素</li>
<li>然后这个细胞的尾部得到第三个元素</li>
<li>然后这个细胞的尾部得到第四个元素</li>
<li>最后这个细胞的尾部得到第五个元素</li>
</ul>
<p>因此,你必须通过5个参考!</p>
<p>对于数组,这要简单得多:您知道第一个元素的引用。您只需要访问右边的引用4个点,因为元素都在一个连续的内存范围内!</p>
<p>如果需要多次访问非常大的列表的随机元素,那么数组就更好了。</p>
<h2>在中间插入元素</h2>
假设你现在想在中间插入一个元素。</p>
<p>使用链接列表:</p>
<ul>
<li>你找到了cons小区转到插入点之前的最后一个元素。</li>
<li>创建一个新的cons单元格,头部指向要添加的元素,尾部与刚刚定位的cons单元格相同。</li>
<li>现在可以将此单元格的尾部更改为指向新创建的单元格。</li>
</ul>
<p>对于数组,就像在中间添加一个元素一样,您需要将每个元素复制到插入点右侧,从右侧复制一个空格!</p>
<p>在这种情况下,链接列表显然更优越。</p>