在Python中,當給變量賦值時,系統會為這個值分配內存空間,然后讓這個變量指向這個值;當改變變量的值時,系統會為這個新值分配另一個內存空間,然后還是讓這個變量指向這個新值。
Python的變量賦值,變量改變的是地址,不變的是內存空間中的值。變量賦值實際上是修改了值的引用,指向了新值的地址。
當給變量賦新值后,沒有任何變量指向舊值的內存空間,這個舊值的空間數據為垃圾數據,系統會自動將其刪除,回收它占用的內存空間。
Python的id()函數可以用來查看變量的內存地址。
如:a的值改為2之后,內存地址也改變了。原值1的內存空間沒有變量指向它,將被系統回收。
# a和1的地址相同,表明a指向1
>>> a=1
>>> id(1)
1536673456
>>> id(a)
1536673456
# a改為2,地址也發生變化
>>> a=2
>>> id(2)
1536673488
>>> id(a)
1536673488
>>> id(1)
1536673456
由此,Python中的值互換,就可以不需要中間變量的參與,直接互換變量即可:a,b=b,a
>>> a=1
>>> b=2
>>> id(a)
1536673456
>>> id(b)
1536673488
>>> a,b=b,a
>>> a
2
>>> b
1
>>> id(a)
1536673488
>>> id(b)
1536673456
>>> id(1)
1536673456
>>> id(2)
1536673488
另外,為了提高內存空間的利用效率,Python對於一些數值比較小的int整型變量使用了相同的內存空間。如果數值越大,則使用的地址會不一樣。
# 1的內存地址都一樣
>>> id(1)
1536673456
>>> id(1)
1536673456
>>> id(1)
1536673456
>>> id(1)
1536673456
>>> id(1)
1536673456
# 1.0的內存地址偶爾不一樣
>>> id(1.0)
3150552963784
>>> id(1.0)
3150552962128
>>> id(1.0)
3150552963784
>>> id(1.0)
3150552962128
>>> id(1.0)
3150552963808
# 1111的內存地址多數都不一樣
>>> id(1111)
3150591410672
>>> id(1111)
3150591411984
>>> id(1111)
3150591412496
>>> id(1111)
3150591410672
>>> id(1111)
3150591411984
# 11111111111111的內存地址都不一樣
>>> id(11111111111111)
3150591412368
>>> id(11111111111111)
3150591412304
>>> id(11111111111111)
3150591412336
>>> id(11111111111111)
3150591411984
>>> id(11111111111111)
3150591412496
本文參考:
https://blog.csdn.net/Invokar/article/details/89138684
https://blog.csdn.net/oppo62258801/article/details/94147509