=+’与‘+=’亦有不同

’=+‘就是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

posted @ 2025-04-15 19:57  凉天  阅读(25)  评论(0)    收藏  举报