Python 面试题:list.append 在 Python 中是如何工作的?

“list.append 如何在 Python 中工作”?这样一个简单的问题,您可能会用“为什么这很重要?”来回答这个问题。

一方面,是否关心 Python 应用程序的性能很重要。

其次,也许是一个更令人信服的原因,如果你打算面试高级 Python 开发人员的角色,它可能会让你得到这份工作。

最后,您可能还会发现了解事物在闪亮美丽的 Python 语言的引擎盖下是如何工作的很有趣和有趣!

介绍

我最近在面试 Python 开发人员的职位。

正处于最后一轮阶段,并且正在接受他们在该地区的一位技术开发人员的技术面试。

他问我的第一个问题是:

list.append在 Python 中如何工作?

从表面上看,这是一个如此简单的问题,但大多数 Python 开发人员都难以回答。

特别是如果他们没有其他编程语言的经验。

那么它是如何list.append工作的呢?

在引擎盖下偷看

   如果您曾经学习过的唯一编程语言是 Python,那么您可能从未听说过数组。但从根本上讲,这     这就是 Python 列表的构建基础。

对于那些不熟悉的人,这里有一个简单的定义:

在计算机科学中,数组是由一组元素组成的数据结构,每个元素至少由一个数组索引或键标识。

这听起来很像 Python 列表。但这里有一个转折点:数组的大小是固定的。

这意味着一旦您创建了一个包含 10 个元素的数组,就不可能向其中添加第 11 个元素。不会array.append(new_element)有帮助。

就像我之前告诉过你的,Python 列表是使用数组实现的。但是列表提供了一些额外的功能,让您永远不会考虑“我可以在列表中存储的最大元素数量是多少?”。

但是 Python 列表是如何实现的呢?一旦你知道了,你就会明白为什么在最坏的情况下,在我们需要存储给定数量的元素 N 的情况下,Python 应用程序可能需要最多 x3 的内存,而不是存储这 N 个元素所需的内存

顺便说一句,这也是面试问题的答案。

 

执行

   为什么 Python 应用程序在使用 Python 列表时可能需要 x3 倍的内存来将 N 个元素存储在数组      中?

 append这与 Python 列表如何允许您通过ing不断地向它们添加更多元素有关。

您可以将 Pythonlist视为一个包含数组及其状态最大长度的类。它可能还将索引存储在要附加新元素的位置。

当您想要添加的元素超出当前数组允许的大小时,Python 只需创建一个新的、更大的数组并将所有现有元素复制到其中。然后将我们首先要附加的元素添加到它的末尾。

让我们形象化它。让我们从一个包含 4 个元素的列表开始:1、2、3 和 4。

正如我们所看到的,目前,我们的列表包含一个大小为 4 的数组,并且该数组的每个元素当前都已满。

那么当我们想将整数 5 添加到列表中时会发生什么?

该列表看到它要添加的索引≥数组的最大大小,因此它知道它必须创建一个更大的数组才能存储新元素。

但是新数组的最大大小是多少?

创建一个最大大小比当前数组大 1 的数组没有多大意义。这实际上意味着在每次追加操作时,我们都必须创建一个新数组。

相反,Python 创建了一个新数组,其空间量为原始数组的 x2。

然后它继续将第一个数组中的元素复制到新数组中。

最后,它销毁原始数组,更新最大大小并将我们想要附加的元素插入到新可用的插槽中。

瞧!

但是我们还没有真正解释为什么 Python 列表需要,最坏的情况下,需要 x3 内存来存储 N 个元素。

用于 N 个元素的 x3 内存

当我第一次被问到这个问题时,我被吓了一跳。为什么它需要x3内存,在最坏的情况下?难道不是 x2,因为我们的内部数组可能(几乎)是我们想要存储的元素数量的两倍?

嗯,是。但魔鬼在细节中。

下图很好地显示了 x3 内存:

当然,x2 内存来自这样一个事实,即列表将在内部存储一个数组,该数组(几乎)是它实际需要存储的元素数量的两倍。没关系。

额外的 N 内存来自这样一个事实,即当我们想要插入最后一个元素时,我们不仅需要在内存中保存 x2 数组,而且我们还需要暂时将长度为 N 的原始数组保存在内存中。

因此,原始数组 + 新加倍的数组将占用(几乎)x3 内存,而不是简单地将 N 个元素存储在数组中。

这就是这个面试问题的完美答案:)

在本文中,我们研究了 Python 如何在底层lists工作。

具体来说,我们深入研究了当您append向列表中添加新元素时内部发生的情况,并准确查看了 Python 在幕后的操作方式。

最后,我们解释了这种设计对内存的影响,并研究了如果你在面试 Python 开发人员角色时遇到这样的问题,你将如何回答。

你觉得这篇文章有用吗?在下面发表评论,让我知道您希望看到更多这样的内容!

猜你喜欢

转载自blog.csdn.net/mopanchun/article/details/127795082