python - 在元组/列表之间转换时会发生什么?

标签 python list python-3.x tuples python-internals

当将元组转换为列表或相反时,python 如何在内部进行转换。

它是“切换标志”(现在你是不可变的,现在你不是!)还是遍历项目并转换它们?

最佳答案

元组和列表是完全不同的类型;因此,当将列表转换为元组或相反时,将创建一个对象并复制元素引用。

Python 确实通过深入到另一个对象的内部结构来优化它;例如,list(tupleobj) 本质上与 list().extend(tupleobj) 相同,其中 listextend function然后使用 Python C API 函数简单地复制元组 C 数组中的引用:

if (PyList_CheckExact(b) || PyTuple_CheckExact(b) || (PyObject *)self == b) {
    PyObject **src, **dest;
    b = PySequence_Fast(b, "argument must be iterable");
    if (!b)
        return NULL;
    n = PySequence_Fast_GET_SIZE(b);
    if (n == 0) {
        /* short circuit when b is empty */
        Py_DECREF(b);
        Py_RETURN_NONE;
    }
    m = Py_SIZE(self);
    if (list_resize(self, m + n) == -1) {
        Py_DECREF(b);
        return NULL;
    }
    /* note that we may still have self == b here for the
     * situation a.extend(a), but the following code works
     * in that case too.  Just make sure to resize self
     * before calling PySequence_Fast_ITEMS.
     */
    /* populate the end of self with b's items */
    src = PySequence_Fast_ITEMS(b);
    dest = self->ob_item + m;
    for (i = 0; i < n; i++) {
        PyObject *o = src[i];
        Py_INCREF(o);
        dest[i] = o;
    }
    Py_DECREF(b);
    Py_RETURN_NONE;
}

PySequence_Fast_ITEMS 是一个宏,用于访问元组的 C 结构中的 ob_item 数组,for 循环从中复制项目数组直接到 self->ob_item 数组(从偏移 m 开始)。

关于python - 在元组/列表之间转换时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29709385/

相关文章:

python - 如果重复的列表项不一个接一个地更改,则更改它们

python - 打印 python 列表,不带引号或逗号后有空格

list - Prolog 中是否有相当于 Haskell 的 enumFromTo 的东西?

python - 是否可以将相同的可选参数传递给多个函数?

python-3.x - 如何根据运行时条件指定类型

python - 根据 Python 中的值在列表中查找位置?

python - Pygame 无法在 Mac 上绘制

python - 如何在 Python ClientForm 对象中搜索 XPath?

javascript - 通过另一个下拉列表 Id ASP.Net 过滤下拉列表

python-3.x - 如何使用 matplotlib 保存图像而不显示它们?