python中+与+=,=+

#对于可变类型:
#+= 不会创建新对象,是在原对象上操作。
#+会创建新对象

备注:
什么是可变/不可变对象
不可变对象,该对象所指向的内存中的值不能被改变。当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址。
可变对象,该对象所指向的内存中的值可以被改变。变量(准确的说是引用)改变后,实际上是其所指的值直接发生改变,并没有发生复制行为,也没有开辟新的出地址,通俗点说就是原地改变
Python中,数值类型(intfloat)、字符串str、元组tuple都是不可变类型。而列表list、字典dict、集合set是可变类型
# 一:对于列表的操作;  + 运算符可以使用在列表上,+ 运算符只需要第二个操作数是可迭代的,isinstance([], Iterable)为True,列表为可迭代的
tmp = [1,2]
print("tmp 内存地址是:%s" %id(tmp))
#第一种
#tmp += [3,4]
#结论:地址未变,对于可变对象,+ 操作改变了值,id肯定会变,而+= 是本地操作,其值原地修改
# tmp 内存地址是:2939192697480
# tmp 内容是:[1, 2, 3, 4]
# tmp += 后内存地址是:2939192697480
#第二种
#结论:地址改变,对于+号操作,可变对象和不可变对象调用的都是__add__操作
#tmp = tmp + [3,4]
# tmp 内存地址是:2332801720968
# tmp 内容是:[1, 2, 3, 4]
# tmp += 后内存地址是:2332831383880
#第三种
#结论:报错
#tmp =+ [3,4]
#TypeError: bad operand type for unary +: 'list'
print("tmp 内容是:%s" %tmp)
print("tmp += 后内存地址是:%s" %id(tmp))

#二:对于int类型,不可变变量,
sum1 =+ 1;未创建新对象;

 


sum1=sum1+1,+创建新对象,

 

 sum1 +=1,创建了新对象,

对于+=号操作,可变对象调用__add__,内存地址不变

不可变对象调用的是__iadd__(不可变对象没有__iadd__)   __iadd__是原地修改,内存地址改变

 

 

 
posted @ 2020-03-24 22:07  三水淼  阅读(1057)  评论(1编辑  收藏  举报