重点说明可变类型 与 不可变类型对象在程序引用过称中的区别:
不可变类型对象
def add(a, b):
a += b
print('函数内a=',a,'内存地址:',id(a))
return a
a = 1
b = 2
c = add(a, b)
print(‘函数外a=’,a,‘内存地址:’,id(a))
print(‘c=’,c,‘a=’,a,‘b=’,b)
返回值:
函数内a= 3 内存地址: 140732939137360
函数外a= 1 内存地址: 140732939137296
c= 3 a= 1 b= 2
通过对比 a 的内存地址可以得知,函数内外的 a 不是同一个对象。
可变类型对象
def add(a, b):
a += b
print('函数内a=',a,'内存地址:',id(a))
return a
a = [1, 2]
b = [3, 4]
c = add(a, b)
print(‘函数外a=’,a,‘内存地址:’,id(a))
print(‘c=’,c,‘a=’,a,‘b=’,b)
返回值:
函数内a= [1, 2, 3, 4] 内存地址: 2290824073800
函数外a= [1, 2, 3, 4] 内存地址: 2290824073800
c= [1, 2, 3, 4] a= [1, 2, 3, 4] b= [3, 4]
函数内部引用可变对象a时,改变的是同一个对象
结论:
不可变类型
以int类型为例:实际上 i += 1 并不是真的在原有的int对象上+1,而是重新创建一个value为6的int对象,i引用自这个新的对象。
可变类型
以list为例。list在append之后,还是指向同个内存地址,因为list是可变类型,可以在原处修改。