+ 收藏我们

网站模板

网站模板搜索
404模板 营销型模板 外贸网站模板 单页模板 双语模板 标签大全
电话:18630701785
首页 > 站长学院 > 在python中,如果x是list,为什么x+=”ha”可以运行,而x=x+”ha”却抛出异常 >

在python中,如果x是list,为什么x+=”ha”可以运行,而x=x+”ha”却抛出异常

时间:2024-04-03 10:20:31

众所周知,在 python 中,+ 运算符可以使用在列表上,+ 运算符只需要第二个操作数是可迭代的,那么 + 显然可以运算在 ha 上,代码如下:

1 >>> x = []
2 >>> x += "ha"
3 >>> x
4 ['h''a']
5  
6 >>> x = + "ha"
7 Traceback (most recent call last):
8 File "<stdin>", line 1in <module>
9 TypeError: can only concatenate list (not "str") to list

 

解答

当我们在列表 list 上使用 += 的时候,其实相当于调用函数 extend(),而不是使用的 +。

 

你可以在一个可迭代(iterable)对象上调用 extend()。

但是,当您使用 + 时,另一个操作数必须是列表(list)。

为什么 python 会如此诡异,也许是出于性能方面的考虑。 调用 + 时,将会创建一个新的对象,并复制里面的所有内容。但是当调用 extend() 函数时,将可以使用现有的空间。

 

这样就会产生另一个副作用:如果你写 X += Y,在其他对列表的引用(reference)中,会看到变化;但如果你使用 X = X + Y,就不会。

 

下面的代码说明了这一点:

01 >>> x = ['a','b']
02 >>> y = ['c', d']
03 >>> z = x
04 >>> x += y
05 >>> z
06 ['a''b''c''d']    // z 也发生了变化
07  
08 >>> x = ['a','b']
09 >>> y = ['c', d']
10 >>> z = x
11 >>> x = + y
12 >>> z
13 ['a''b']  // z 函数原始值

 

python:+= 的源代码:

01 static PyObject *
02 list_inplace_concat(PyListObject *self, PyObject *other)
03 {
04     PyObject *result;
05     result = listextend(self, other);
06     if (result == NULL)
07         return result;
08     Py_DECREF(result);
09     Py_INCREF(self);
10     return (PyObject *)self;
11 }

 

python:+ 的源代码:

01 static PyObject *
02 list_concat(PyListObject *a, PyObject *bb)
03 {
04     Py_ssize_t size;
05     Py_ssize_t i;
06     PyObject **src, **dest;
07     PyListObject *np;
08     if (!PyList_Check(bb)) {
09         PyErr_Format(PyExc_TypeError,
10                   "can only concatenate list (not \"%.200s\") to list",
11                   bb->ob_type->tp_name);
12         return NULL;
13     }
14     // etc ...

 

有问题可以加入网站技术QQ群一起交流学习

本站会员学习、解决问题QQ群(691961965)

客服微信号:lpf010888

Title