=+’与‘+=’亦有不同
’=+‘就是a=a+1这类的操作
’+=‘就是a+=1这类的操作
是不是看起来一样?其实有点区别
先看一个例子:
a = [20, 50] print(id(a)) # 1932373650496 a += [30] print(id(a)) # 1932373650496 a = a + [56] print(id(a)) # 1932375047232 a.append(45) print(id(a)) # 1932375047232
def add(p): print '进来时,p的id是',id(p) p+=[1] print 'p执行p+=[1]运算后的值为:',p print '加法后p的id是:',id(p) a=[1,3,3,3] print 'a进入函数前的id是:',id(a) add(a) print 'a进入函数后的值是:',a print 'a进入函数后的id是:',id(a)
a进入函数前的id是: 116958664 进来时,p的id是 116958664 p执行p=p+[1]运算后的值为: [1, 3, 3, 3, 1] 加法后p的id是: 116958664 a进入函数后的值是: [1, 3, 3, 3, 1] a进入函数后的id是: 116958664
a的值是变了的,因为列表是可变对象,’+=‘操作是直接在a所指向的对象上进行修改,并没有产生新的引用。
def add(p): print '进来时,p的id是',id(p) p=p+[1] print 'p执行p=p+[1]运算后的值为:',p print '加法后p的id是:',id(p) a=[1,3,3,3] print 'a进入函数前的id是:',id(a) add(a) print 'a进入函数后的值是:',a print 'a进入函数后的id是:',id(a)
a进入函数前的id是: 186860104 进来时,p的id是 186860104 p执行p=p+[1]运算后的值为: [1, 3, 3, 3, 1] 加法后p的id是: 116958664 a进入函数后的值是: [1, 3, 3, 3] a进入函数后的id是: 186860104
发现a的值并没有变,这是因为在执行p=p+[1]时,有一个赋值动作’=‘,会产生一个新的对象,所以p这时已经指向了别的对象,这也说明了python没有赋值,它的赋值是产生一个新的对象。
>>> a=[1,2,3] >>> b=[1,2,3] >>> id(a),id(b) (45735624L, 45791816L) >>> a=a+[2] >>> id(a) 45793224L
a,b都是将[1,2,3]付给a,b,但是他们分别产生了新的对象(id不同)。
但是也有这样的情况:
>>> a=3 >>> b=3 >>> strA='asd' >>> strB='asd' >>> id(a),id(b) (38102392L, 38102392L) >>> id(strA),id(strB) (45829736L, 45829736L)
发现他们的id一样是不是,那是因为python对一些整型数字和字符串会进行缓存,使得他们id一样,造成了他们没有创建新对象的假象。
继续刚才’=+‘与’+=‘的话题,一开始我们是使用的列表,如果现在我使用元组呢:
观察结果:
’=+‘:
def add(p): print '进来时,p的id是',id(p) p=p+(1,) print 'p执行p=p+(1,)运算后的值为:',p print '加法后p的id是:',id(p) a=(1,3,3) print 'a进入函数前的id是:',id(a) add(a) print 'a进入函数后的值是:',a print 'a进入函数后的id是:',id(a)
结果为:
a进入函数前的id是: 186690296 进来时,p的id是 186690296 p执行p=p=p+(1,)运算后的值为: (1, 3, 3, 1) 加法后p的id是: 185401496 a进入函数后的值是: (1, 3, 3) a进入函数后的id是: 186690296
发现a一样没有发生改变,和a是list的情况一样。
再看’+=‘:
def add(p): print '进来时,p的id是',id(p) p+=(1,) print 'p执行p+=(1,)运算后的值为:',p print '加法后p的id是:',id(p) a=(1,3,3) print 'a进入函数前的id是:',id(a) add(a) print 'a进入函数后的值是:',a print 'a进入函数后的id是:',id(a)
a进入函数前的id是: 186690656 进来时,p的id是 186690656 p执行p+=(1,)运算后的值为: (1, 3, 3, 1) 加法后p的id是: 185401496 a进入函数后的值是: (1, 3, 3) a进入函数后的id是: 186690656
欸,怎么a为元组和a为列表的情况不一样,现在a没有发生变化。那是因为元组是不可变对象,在执行p+=(1,)时,无法对p之前指向的对象进行本地操作,只能创建一个新对象了。
同样的,字符串等不可变对象也是会产生一个新对象:
如:
>>> a="sd" >>> id(a) 45643056L >>> a+='***' >>> id(a) 45829016L
好了,总结一下就是:
1,python的赋值会产生一个新对象
2,执行’=+‘操作时会产生一个新对象
3,执行’+=‘操作时,对于可变对象,例如列表,其会对原对象进行本地修改值,不会产生新对象,而对于不可变对象,则会还是会产生新的对象。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/jiruiYang/article/details/53019991

浙公网安备 33010602011771号