对于python列表+= 和+操作的一些误解

mac2025-07-15  2

目录

现象

原因

源码

+=的源码:

+的源码:

现象

先上代码:

方式一:

>>> a = [] >>> a += 'a' >>> a ['a']

方式二:

>>> a = [] >>> a = a + 'a' Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can only concatenate list (not "str") to list >>>

首先定义了一个空列表用变量a表示,方式一是对a执行+=操作方式二是对a执行的+操作,但是得到的结果却是不一样。有python基础的同学肯定第一反应就是应该报错呀,不同的数据类型之间不能进行运算呀,没错,我的第一反应也是酱紫的,但是实践出真知,python又捉弄了我们一把。那么到底为什么能执行成功呢?

原因

python中列表的+=相当于执行的是extend操作,在上述代码中也就是将右侧的字符串'a'添加到了变量a中,所以命令行下调用a时,显示的是有一个值为'a'的列表;但是对列表执行+操作时,操作数必须是列表,所以就出现了上面的情况。而且+操作会生成一个新的对象,而+=还是操作的原来的对象,如:

+=操作:

>>> a = [1] >>> id(a) 2535493303944 >>> a += [2,3,4] >>> a [1, 2, 3, 4] >>> id(a) 2535493303944

+操作:

>>> a = [1] >>> id(a) 2535493303944 >>> a = a + [2,3,4] >>> a [1, 2, 3, 4] >>> id(a) 2535493303752

我们可以看到+操作后变量a的地址已经发生了变化,而+=之后变量a还是之前的地址

源码

+=的源码:

static PyObject * list_inplace_concat(PyListObject *self, PyObject *other) { PyObject *result; result = listextend(self, other); if (result == NULL) return result; Py_DECREF(result); Py_INCREF(self); return (PyObject *)self; }

+的源码:

static PyObject * list_concat(PyListObject *a, PyObject *bb) { Py_ssize_t size; Py_ssize_t i; PyObject **src, **dest; PyListObject *np; if (!PyList_Check(bb)) { PyErr_Format(PyExc_TypeError, "can only concatenate list (not \"%.200s\") to list", bb->ob_type->tp_name); return NULL; } // etc ...

参考链接:

https://www.cnblogs.com/shixisheng/p/7356835.html

最新回复(0)