python中‘=+’与‘+=’的区别

’=+‘就是a=a+1这类的操作
’+=‘就是a+=1这类的操作
是不是看起来一样?其实有点区别
先看一个例子:

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进入函数后,其的值是多少?
附上结果:

a进入函数前的id是: 116958664
进来时,p的id116958664
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的id186860104
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的id186690296
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的id186690656
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,执行’+=‘操作时,对于可变对象,例如列表,其会对原对象进行本地修改值,不会产生新对象,而对于不可变对象,则会还是会产生新的对象。


参考博客:
【1】http://blog.csdn.net/helen5106/article/details/7572883

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值