社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

当Python列表遇上复合赋值运算符+=

Python小屋 • 6 年前 • 368 次点击  

首先感谢集美大学蔡莉白老师发现这个问题并与我沟通交流,我在蔡老师提供的代码基础上又稍作扩展和补充。

对于列表x而言,x += y和x = x+y并不等价,在一定程度上,+=类似于append(),但是又不完全一样。

正常来讲,作用于列表时,运算符+=的用法是这样的:

>>> x = []

>>> x += [1, 2, 3]

>>> x

[1, 2, 3]

列表与列表相加,从效果上来看,似乎与x = x + [1, 2, 3]是一样的,然而,内部的区别的还是很大的。例如:

>>> x = []

>>> id(x)

48248392

>>> x += [3]

>>> id(x)

48248392

>>> x = x + [4]

>>> x

[3, 4]

>>> id(x)

49375176

这段代码说明的是,+=属于原地操作,不会修改列表首地址,类似于列表append()方法,而... = ...+...这样的写法是创新一个新对象,会修改列表首地址。

既然+=类似于append()方法,那是不是用法也一样呢?看下面的代码:

>>> x = []

>>> x.append(3)

>>> x

[3]

>>> x += 5

Traceback (most recent call last):

  File "", line 1, in

    x += 5

TypeError: 'int' object is not iterable

结果证明,+=和append()的用法还是有区别的。但是,我们无意中注意到上面的异常信息说整数是不可以迭代的,这句话似乎有深意啊。如果我们在+=的左侧是列表,而右边是可迭代对象,会是什么结果呢?

>>> x = []
>>> x += 'ab'
>>> x
['a', 'b']
>>> x += (1,2)
>>> x
['a', 'b', 1, 2]
>>> x += {1,2}
>>> x
['a', 'b', 1, 2, 1, 2]
>>> x += {1:'a', 2:'b'}
>>> x
['a', 'b', 1, 2, 1, 2, 1, 2]
>>> x += range(3)
>>> x
['a', 'b', 1, 2, 1, 2, 1, 2, 0, 1, 2]
>>> x += map(str, range(3))
>>> x
['a', 'b', 1, 2, 1, 2, 1, 2, 0, 1, 2, '0', '1', '2']

使用+=运算符居然能把列表和元组、集合、字典甚至map对象、range对象里的元素连接到一起。

那么运算符+是不是也支持类似的用法呢?遗憾的是,不支持,有代码为证:
>>> x = x + '1234'
Traceback (most recent call last):
  File "", line 1, in
    x = x + '1234'
TypeError: can only concatenate list (not "str") to list

>>> x = x + {1, 2, 3}
Traceback (most recent call last):
  File "", line 1, in
    x = x + {1, 2, 3}
TypeError: can only concatenate list (not "set") to list

>>> x = x + {1:'a', 2:'b'}
Traceback (most recent call last):
  File "", line 1, in
    x = x + {1:'a', 2:'b'}
TypeError: can only concatenate list (not "dict") to list


简单总结一下,对于列表而言,+=右侧的对象可以是任何Python可迭代对象,并且+=的过程类似于循环+append(),如下面的代码:

>>> x = []
>>> x += '1234'
>>> x
['1', '2', '3', '4']
>>> x = []
>>> for item in '1234':
    x.append(item)

>>> x
['1', '2', '3', '4']




----------相关阅读---------

Python编程一定要注意的那些“坑”(七)

Python编程一定要注意的那些“坑”(六)

Python编程一定要注意的那些“坑”(五)

Python编程一定要注意的那些“坑”(四)

Python中一定要注意的那些“坑”(三)

Python编程中一定要注意的那些“坑”(二)

Python编程中一定要注意的那些“坑”(一)

Python函数默认值参数的2个坑



----------喜大普奔----------

1、继《Python程序设计基础》(2017年9月第5次印刷)、《Python程序设计(第2版)》(2017年9月第4次印刷)、《Python可以这样学》(2017年7月第3次印刷)系列图书之后,董付国老师新书《Python程序设计开发宝典》已于2017年8月1日在清华大学出版社出版,并于2017年9月进行了第2次印刷。为庆祝新书《Python程序设计开发宝典》全面上架,清华大学出版社联合“赣江图书专营”淘宝店推出特价优惠活动,《Python程序设计开发宝典》原价69元,新书上架期间超低价39.8元,可以复制下面的链接使用浏览器打开查看图书详情和购买:

https://detail.tmall.com/item.htm?spm=a1z10.3-b-s.w4011-14464369246.84.46f16db0roWfX4&id=557107249812&rn=339cbc9df2bac424664103917dedfbd2&abbucket=8&tbpm=3


2、董付国老师6本Python系列图书阅读指南


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/NJVO7gZhBj
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/3824
 
368 次点击