python - 在 Python 中连接两个列表时内部会发生什么?

标签 python list cpython

当连接两个列表时,

a = [0......, 10000000]
b = [0......, 10000000]

a = a + b

Python 运行时是否分配更大的数组并循环遍历两个数组并将 ab 的元素放入更大的数组中?

还是循环遍历 b 的元素并将它们附加到 a 并根据需要调整大小?

我对 CPython 的实现很感兴趣。

最佳答案

你可以通过查看aid在串联b前后找到:

>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> id(a)
140025874463112
>>> a = a + b
>>> id(a)
140025874467144

这里,由于 id 不同,我们看到解释器创建了一个新列表并将其绑定(bind)到名称 a。旧的 a 列表最终会被垃圾回收。

但是,当使用扩充的赋值运算符 += 时,行为可能会有所不同:

>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> id(a)
140025844068296
>>> a += b
>>> id(a)
140025844068296

这里,由于 id 相同,我们看到解释器重用了相同的列表对象 a 并附加了 b 的值> 给它。

有关更多详细信息,请参阅以下问题:

关于python - 在 Python 中连接两个列表时内部会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65616945/

相关文章:

java - 不考虑顺序比较两个 List<E>

python - django zip 不等列表

python - 是什么导致 [*a] 过度分配?

python - 将函数应用于小数据帧 : shape mismatch: value array of shape (4, ) 无法广播

python - 类型错误 : replace() takes no keyword arguments when we use (old ='XYZ' , 新 ='ABC' )

python - 在 python 中使用 menpo API 构建事件外观模型

python - 我可以通过使用循环使迭代变得更容易吗?

python - 在 Pandas 数据框中填充一列字符串

python - 如何在 C 中为 Python 设置静态类变量?

python - 日期时间模块中异常消息的来源。值错误: year 10000 is out of range