python:中a+=b与a=a+b有什么区别
2017-03-06 11:02
381 查看
看到一个比较有意思的问题,就是python中a+=b与a=a+b有什么区别
链接: http://stackoverflow.com/questions/6951792/python-a-b-not-the-same-as-a-a-b 总体上讲,a+=b是改变了a原始的值,而a=a+b是计算出a+b后,a在指向那个值。这个也跟a和b的类型有关。当a和b是int或者string不可改变的时候,二者效果一样。
>>> a=[1,2,3,4]
>>> b=a
>>> a+=[5]
>>> a,b
([1, 2, 3, 4, 5], [1, 2, 3, 4, 5])#a,b的“地址”一样
>>> a=[1,2,3,4]
>>> b=a
>>> a=a+[5]#a+[5]后有一个新地址,再使a指向这个新地址,因此a不再是以前的a,而b还是以前的那个a//b,所以b不变
>>> a,b
([1, 2, 3, 4, 5], [1, 2, 3, 4])
要解释这个问题,看看python里的源码即可。知道+=这个操作实际上是调用了__iadd__方法(可以用此重载操作符,stackoverflow上有这个重载+=的问题).而在__iadd__方法内部,是直接调用了extend()方法,而a.extend(‘3’)和a.extend([‘3’])没有区别吗?表面上看来是没有区别的。
>>> a=[1,2]
>>> a.extend('3')
>>> a
[1, 2, '3']
>>> a.extend(['3'])
>>> a
[1, 2, '3', '3']
而实际上,在extend(arg)方法内部,又去调用了append方法
def extend(self, values):
for v in values:
self.append(v)
这样,’3’ 和 [‘3’] 就没区别被append进去了。字符串会被当作数组append进去。 >>> a
[1, 2, '3', '3']
>>> a.extend('abc')
>>> a
[1, 2, '3', '3', 'a', 'b', 'c']
>>> a.extend(['23','ab'])
>>> a
[1, 2, '3', '3', 'a', 'b', 'c', '23', 'ab']
参考文献:http://stackoverflow.com/questions/6951792/python-a-b-not-the-same-as-a-a-b
https://my.oschina.net/sukai/blog/616652
链接: http://stackoverflow.com/questions/6951792/python-a-b-not-the-same-as-a-a-b 总体上讲,a+=b是改变了a原始的值,而a=a+b是计算出a+b后,a在指向那个值。这个也跟a和b的类型有关。当a和b是int或者string不可改变的时候,二者效果一样。
>>> a=[1,2,3,4]
>>> b=a
>>> a+=[5]
>>> a,b
([1, 2, 3, 4, 5], [1, 2, 3, 4, 5])#a,b的“地址”一样
>>> a=[1,2,3,4]
>>> b=a
>>> a=a+[5]#a+[5]后有一个新地址,再使a指向这个新地址,因此a不再是以前的a,而b还是以前的那个a//b,所以b不变
>>> a,b
([1, 2, 3, 4, 5], [1, 2, 3, 4])
>>> a=[[1],[2]] >>> b=[] >>> b+=a[0:1]#这句将列表a中第一个元素的“指针”给了b[0],此时a[0]和b[0]是一样的 >>> a,b ([[1], [2]], [[1]]) >>> b[0][0]='change'#b[0]就相当于取到了a里面的第一个元素,也是一个列表。b[0][0]也就定位到了a[0][0],对应的内容就是1 >>> a,b ([['change'], [2]], [['change']])#因此b[0][0]改了,a[0][0],也相应的改了。 >>> id(b[0][0]);id(a[0][0])#不用说,地址一样 11534048 11534048 >>> id(b[0]);id(a[0]) 12903888 12903888 >>> b[0],a[0] (['change'], ['change']) >>> b[0]='another'#这里应该是有一块新地址,再让b[0]指向这个新地址。 >>> a,b ([['change'], [2]], ['another'])# 因此a中的值没有变 >>> a[0] ['change'] >>> id(b[0]);id(a[0]) #此时,b[0]跟a[0]的地址不一样 13056672 12903888
>>> a=[1,2]#初始化a,为列表[1,2] >>> a+='3' #直接+=方式,追加元素”3” >>> a [1, 2, '3'] >>> a+=['4'] #追加列表,比上面的‘3’ 多了个[]。 >>> a [1, 2, '3', '4']#同样能追加成功,怎么感觉有无[]没有区别啊? >>> a+'5'#当然,直接+字符串,就抛异常了。 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can only concatenate list (not "str") to list
要解释这个问题,看看python里的源码即可。知道+=这个操作实际上是调用了__iadd__方法(可以用此重载操作符,stackoverflow上有这个重载+=的问题).而在__iadd__方法内部,是直接调用了extend()方法,而a.extend(‘3’)和a.extend([‘3’])没有区别吗?表面上看来是没有区别的。
>>> a=[1,2]
>>> a.extend('3')
>>> a
[1, 2, '3']
>>> a.extend(['3'])
>>> a
[1, 2, '3', '3']
而实际上,在extend(arg)方法内部,又去调用了append方法
def extend(self, values):
for v in values:
self.append(v)
这样,’3’ 和 [‘3’] 就没区别被append进去了。字符串会被当作数组append进去。 >>> a
[1, 2, '3', '3']
>>> a.extend('abc')
>>> a
[1, 2, '3', '3', 'a', 'b', 'c']
>>> a.extend(['23','ab'])
>>> a
[1, 2, '3', '3', 'a', 'b', 'c', '23', 'ab']
参考文献:http://stackoverflow.com/questions/6951792/python-a-b-not-the-same-as-a-a-b
https://my.oschina.net/sukai/blog/616652
相关文章推荐
- Python3字典中items()和python2.x中iteritems()有什么区别
- 用Python匹配HTML tag的时候,<.*>和<.*?>有什么区别?
- Python2.7中input和raw_input函数有什么区别
- python: python中a+=b与a=a+b有什么区别
- C语言和C++ C#及python的区别在什么地方?
- Python调用C的DLL和VC调用有什么区别?
- (1)python中的类中属性元素加self.和不加self.的区别是什么?
- python 中 os._exit(), sys.exit(), exit() 的区别是什么?
- Python中字符串的split()方法和split(‘ ’)有什么区别
- Python IDLE(python GUI)与python(comand line)有什么区别
- Python - 子类继承父类 和 Java有什么区别
- Python的静态方法和类方法有什么区别
- python中的模块、库、包有什么区别
- Python中super()和__init__()有什么区别?
- python2.7里的StringIO.StringIO与BytesIO有什么区别
- python #coding:utf-8和setdefaultencoding有什么区别?
- Python3字典中items()和python2.x中iteritems()有什么区别
- 阿里巴巴教研专家为你解答Python和Java有什么区别?
- Python 2.7与Python3 的print有什么区别?
- python .py .pyc .pyw 文件有什么区别