在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