python:a = a+b与a += b的不同

python解释器:python3
a = a + b
创建过程是:先创建的a+b的对象放入内存,然后变量a指向了a+b的对象,这事实上已经改变了a原本的指向,指向了新的地址。
a += b
创建过程是:把a原本指向内存地址的对象的值改变成了a+b,能不能改变取决于该对象的值能不能被改变。
对于可变对象类型和不可变对象类型有不同的结果:
可变对象类型:+=改变了原本地址上对象的值,不改变原本的指向地址;=则改变了原本的指向地址,创建了新的对象,并指向新的地址
测试代码:

a = [10]
b = [10]
print('a地址:', id(a))
a = a + b
print('"a=a+=b"的地址:', id(a), 'a的值:', a)

a1 = [10]
b1 = [10]
print('a1地址:', id(a1))
a1 += b1
print('"a1=a1+=b1"的地址:', id(a1), 'a1的值:', a1)

a地址: 2275890970376
"a=a+=b"的地址: 2275890970056 a的值: [10, 10]
a1地址: 2275890970376
"a1=a1+=b1"的地址: 2275890970376 a1的值: [10, 10]

不可改变对象类型:都是改变原本的指向地址,指向新创建的对象地址
测试代码:

a = 10
b = 10
print('a地址:', id(a))
a = a + b
print('"a=a+=b"的地址:', id(a), 'a的值:', a)

a1 = 10
b1 = 10
print('a1地址:', id(a1))
a1 += b1
print('"a1=a1+=b1"的地址:', id(a1), 'a1的值:', a1)

a地址: 1420567536
"a=a+=b"的地址: 1420567856 a的值: 20
a1地址: 1420567536
"a1=a1+=b1"的地址: 1420567856 a1的值: 20

不可变对象类型:数字,字符串,元组
可变对象类型:列表,字典
可变和不可变:指的是内存上某个地址的对象的值能不能改变,能就变,不能就在内存中重新创建一个地址放入新的值
值得提及的是:实践中发现为什么200的内存地址不会变,而300的内存地址会一直变?
经查阅:[-5,256],python已经缓存入内存中了,为了方便提取和增加运行速度吧!

猜你喜欢

转载自blog.csdn.net/coolpail/article/details/81543377
A+B