`

「译」在 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 的区别的相关资料,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。

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

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

    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-笔试题.doc

    下列哪个表达式在Python中是非法的? B A. x = y = z = 1 B. x = (y = z + 1) C. x, y = y, x D. x += y 2. python v1 v2 命令运行脚本,通过 from sys import argv如何获得v2的参数值? C A. argv[0] B. argv[1] C....

    大一python编程题库和答案-Python编程练习题.pdf

    &gt;&gt;&gt; print sum 231 &gt;&gt;&gt; 累加 x = int(raw_input('please input x : ' )) layer = 1 while layer &lt;= x: lsum = 0 count =1 while count &lt;= layer: lsum += count count += 1 fstr = '' for num in

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

    主要介绍了关于Python中表达式i += x与i = i + x是否等价的相关资料,文中通过示例代码介绍的很详细,相信对大家具有一定的参考价值,有需要的朋友们下面来一起看看吧。

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

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

    [详细完整版](完整版)python考试复习题库.doc

    在Python中,下面代码的运行结果是( ) x=365 g=x%10 #%为求余的意思 s=x//10%10 # //为整除的意思 b=x//100 sum=g*100+s*10+b #sum英文是求和的意思 print(sum) A.365 B.14 C.563 D.41 2.在VB中,下列与...

    python判断题题库-《Python程序设计》判断题1-240题.pdf

    (错) 3、Python 3.x和Python 2.x唯⼀的区别就是:print在Python 2.x中是输出语句,⽽在Python 3.x中是输出函数。(错) 4、在Windows平台上编写的Python程序⽆法在Unix平台运⾏。(错) 5、不可以在同⼀台计算机上...

    python-笔试题.docx

    下列哪个表达式在Python中是非法的? B A. x = y = z = 1 B. x = (y = z + 1) C. x, y = y, x D. x += y 2. python my.py v1 v2 命令运行脚本,通过 from sys import argv如何获得v2的参数值? C A. argv[0] B. argv...

    python笔试题(1).docx

    下列哪个表达式在Python中是非法的?B A. x = y = z = 1 B. x = (y = z + 1) C. x, y = y, x D. x += y 2. python my.py v1 v2 命令运行脚本,通过from sys import argv 如何获得v2的参数值? C A. argv[0] B. argv...

    python2.x与python3.x的区别

    喜欢python的人都知道python2.x与python3.x的...我就是其中一个不适应者,在后来使用python3.x的过程中,结合python3.1.3的官方帮助文档和自己的理解收集了一些自己发现有用的东西,希望给大家方便。文档排版很整洁哦。

    编程(完整版)Python题库word练习.doc

    在python语言中表示"x属于区间[a,b)" 的正确表达式是( ) A.a x or x &lt; b B.a&lt;= x and x &lt; b C.a x and x&lt; b D.a&lt;=x or x下列哪个语句在Python中是非法的?( ) A.x = y = z = 1 B.x = (y = z + 1) C.x,...

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

    python笔试题.docx

    python笔试题全文共8页,当前为第1页。python笔试题全文共8页,当前为第1页。python笔试题 python笔试题全文共... 下列代码执行结果是什么 D x = 1 def change(a): x+= 1 print x change(x) A. 1 B. 2 python笔试题全文

    Python测试题.doc

    Python测试题 一、填空题 1.Python使用符号 # 标示注释;以 缩进对齐 划分语句块。 2、Python序列类型包括 字符串 、 列表 、 ... ( ) A、x = y = z = 1 B、x = (y = z + 1) C、x, y = y, x D、x += y 2.关于Pyt

    python-笔试题(1).doc

    下列哪个表达式在Python中是非法的? B A. x = y = z = 1 B. x = (y = z + 1) C. x, y = y, x D. x += y 2. python v1 v2 命令运行脚本,通过 from sys import argv如何获得v2的参数值? C A. argv[0] B. argv[1] C....

    python考试题目及答案-python期末考试试题汇总.doc

    python考试题目及答案-python期末考试试题汇总 6.for i in range(2,n): if n%i==0:break if i==n-1: print('是素数') else: print('不是素数') 7.'abcabcabc'.count('abc')的值为__3__。 8.对于有else子句的for循环...

Global site tag (gtag.js) - Google Analytics