a=10 # 不可变类型 b='hello' # 不可变类型 c=[1,2,3] # 可变类型 print('------1-------') print(id(a)) print(id(b)) print(id(c)) def haha(a,b,c): print('------2-------') print(id(a)) print(id(b)) print(id(c)) a+=1 b+='python' c+=[4,5,6] print('------3-------') print(id(a)) print(id(b)) print(id(c)) haha(a,b,c)
# 取的是创建时候的引用 print('------4-------') print(id(a)) print(id(b)) print(id(c))
print(a,b,c)
结果:
C:\python\python.exe E:/learnProject/7.数据分析/测试.py
------1-------
1635406912
6912632
14473416
------2-------
1635406912
6912632
14473416
------3-------
1635406944
14498224
14473416
------4-------
1635406912
6912632
14473416
10 hello [1, 2, 3, 4, 5, 6]
正题:
当不可变类型做运算,在函数内的指向发生改变(原来的a不指向原来的地址)
当可变类型做运算,在函数内的指向发生改变(原来的c指向原来的地址)
c = [1, 2, 3] print(id(c)) def haha(c): print(id(c)) c =c + [4, 5, 6] print(id(c)) haha(c) print(id(c)) print(c)
结果:
14014664 14014664 14037448 14014664 [1, 2, 3]
------------------------------------------------------------------
c+=[4,5,6] 和 c=c+[4,5,6]区别 c是可变类型前者会在原有的内存地址操作, 后者创建新的内存地址操作
总结:
传的都是引用, 只不过在进行运算的时候 不可变类型只要运算就会创建新的内存地址 引用传不出来值不会改变
对于可变类型 只要运算 不创建新的内存地址, 就会对原来的内存地址的值进行修改 所以值变了
在第二个实例 c=c+[4,5,6] c会创建新的内存空间 所以值没有改变