`

「译」在 python 中,如果 x 是 list,为什么 x += "ha" 可以运行,而 x = x + "ha" 却抛出异常呢?

阅读更多

 

问题

众所周知,在 python 中,+ 运算符可以使用在列表上,+ 运算符只需要第二个操作数是可迭代的(原文:iterable。@justjavac),那么 + 显然可以运算在 "ha" 上。

代码如下:

>>> x = []
>>> x += "ha"
>>> x
['h', 'a']

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

解答

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

  • 你可以在一个可迭代(iterable)对象上调用 extend()。
    • 但是,当您使用 + 时,另一个操作数必须是列表(list)。

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

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

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

>>> x = ['a','b']
>>> y = ['c', d']
>>> z = x
>>> x += y
>>> z
['a', 'b', 'c', 'd']    // z 也发生了变化

>>> x = ['a','b']
>>> y = ['c', d']
>>> z = x
>>> x = x + y
>>> z
['a', 'b']  // z 函数原始值

参考文献

Python source code for list.

python:+= 的源代码:

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;
}

python:+ 的源代码:

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 ...

原文:python - If x is list, why does x += "ha" work, while x = x + "ha" throw an exception?

译文:在 python 中,如果 x 是 list,为什么 x += "ha" 可以运行,而 x = x + "ha" 却抛出异常呢?

译者:justjavac

24
6
分享到:
评论
2 楼 nodejs 2013-03-12  
coffeescript 写道
很多语言都有这个问题。

在java中,short a += 4 也存在一个隐式类型转换。
1 楼 coffeescript 2013-03-12  
很多语言都有这个问题。

相关推荐

    Python中表达式x += y和x = x+y 的区别详解

    本文主要给大家介绍的是关于Python中表达式x += y和x = x+y 区别的相关内容,分享出来供大家参考学习,下面来看看详细的介绍: 直接看下面代码: x +=y In [66]: id(a) Out[66]: 4476839480 In [67]: id(b) Out[67]:...

    python2.x和python3.x的区别

    - **变化**:Python 2.x中的字符串默认使用ASCII编码,而Python 3.x中的字符串默认为Unicode编码。 - **示例**: - Python 2.x: ```python s = "hello" # ASCII编码 u = u"你好" # Unicode编码 ``` - Python 3...

    详解Python中表达式i += x与i = i + x是否等价

    在Python编程语言中,`i += x` 和 `i = i + x` 两种表达式在大部分情况下是等价的,但在处理可变对象(如列表)时,它们的行为有所不同。这个问题的关键在于理解Python中的可变对象和不可变对象的概念,以及它们如何...

    python中is与双等于号“==”的区别示例详解

    最近在给小伙伴写段小代码用于爬取一个GIS的各高层数据,python中使用了”is”来代替”==”,结果下载至512的时候出了问题。 代码如下 def get_next(x, y, z): z += 1 if z is 2**x: # 应该用if z == 2**x y += ...

    Python2.x和3.x主要差异总结

    在 Python 2.x 中,print 是一个语句,而在 Python 3.x 中,print 是一个函数。 Python 2.x 和 3.x 之间的差异很多,其中一些关键的差异包括基本类型、八进制字面量表示、运算符、比较运算符和语句等。理解这些差异...

    python2.x与python3.x的区别

    在 Python 2.x 中,`input()` 直接执行用户输入的 Python 表达式,而 `raw_input()` 提供原始的字符串输入。在 Python 3.x 中,`input()` 替代了 `raw_input()`,直接返回用户输入的字符串,无需担心安全问题,因为...

    Python2.x与3_.x版本区别

    - **示例**:在 Python 3.x 中,`1 / 2` 的结果为 `0.5`,而在 Python 2.x 中结果为 `0`。 - **地板除法**:`//` 在两个版本中均一致,表示向下取整。 ##### 4. 异常处理 - **Python 2.x**:捕获异常时使用 `except...

    Python实验课4-13习题及答案.docx

    已知 x = 3,并且 id(x)的返回值为 496103280,那么执行语句 x += 6 之后,表达式 id(x)== 496103280 的值为 False。 表达式 1234%1000//100 的值为 2。已知 x = 3 + 4j 和 y = 5 + 6j,那么表达式 x+y 的值为 8 + ...

    DjangoUeditor本人完美修改版(支持Python2.x和Python3.X)

    下载DjangoUeditor,发现不支持Python3.x,经过修改,在Python2.X(测试环境为Python2.6.6 + django-1.6.5 和Python2.7.8 + django-1.6.5)和Python3.X(测试环境为Python3.4.1 + django-1.6.5)下完美支持 下载...

    python 遗传算法 求解函数f(x)=x+10sin5x+7con4x在给定区间0 9上的极大值

    python写的,ipynb文件导出的html格式文件。简单修改代码,可就求解任意给定区间上任意函数的最大值(修改代码中的区间范围和函数表达式)github链接: ...

    编程python考试最新试题及答案解析练习.doc

    2. 表达式"x属于区间[a,b)"在Python中的正确表示是使用and操作符连接两个条件,即a&lt;= x and x ,所以答案是B.a&lt;= x and x 。 3. 在Python中处理数据除了Jupyter Notebook,还可以使用Python IDLE,这是一个集成...

    Python答案(仅供参考).docx

    它并非与Python 2.x完全兼容,特别是在语法和某些内置函数上存在差异,例如 print 语句在Python 2.x中是语句而在Python 3.x中是函数。Python是解释型语言,这意味着代码不需要预先编译,而是逐行执行。虽然它出现较...

    python 求某条线上特定x值或y值的点坐标方法

    问题可以转换为:求一条垂直于x轴或平行于y轴的直线与该线的交点 import numpy as np import shapely.geometry as SG #某条线 list(zip(x,y))为线上的坐标点的list line = SG.LineString(list(zip(x,y))) #(1,0)...

    (续3)Python3.x+Pyqt5实现主窗体里的工具栏,且工具栏里可以同时显示图标和文字

    在本教程中,我们将深入探讨如何使用Python3.x和PyQt5库来创建一个主窗体,并在其中集成工具栏,使得工具栏上的按钮既能显示图标也能显示文字。PyQt5是一个强大的图形用户界面(GUI)框架,它允许开发者用Python语言...

    试题python基础试题(含答案).pdf

    13. 在 python 中,运行以下程序,结果应为a=5b=7b+=3a=b*20a+=2a=a%bprint(a,b)的结果是20,10。 知识点:Python中的变量赋值和算术运算符的使用。 14. 关于 python 程序设计语言,下列说法不正确的是python 只能...

    notepad++下PythonScript插件

    写在前面:该插件可以直接在notepad++插件管理器中安装,如果安装完之后,运行出现: Unknown exception和python script plugin did not accept the script的报错提示,一般在window7/8/10 64位系统报错。...

    openopc for python 3.x

    openopc for python3.x 库

    python_python_

    在Python编程语言中,我们可以利用其简洁明了的语法特性来快速实现各种计算和逻辑判断。根据提供的文件信息,我们将探讨以下几个知识点: 1. **循环与条件语句**: - 求1-10的和:在Python中,可以使用`for`循环...

    资料Python完全新手教程复习知识点试卷试题.doc

    19. 非法语句:在Python中,A "x = y = z = 1" 是合法的,B "x = (y = z + 1)" 不允许在赋值中进行赋值操作,C "x, y = y, x" 是交换变量值的合法方式,D "x += y x=x+y" 可以简化为`x += y`。 20. Python文件后缀...

Global site tag (gtag.js) - Google Analytics