变量
三个组成部分:
1变量名:反应变量值所描述的意义,并且可以用来引用变量值。
2赋值符号:赋值。
3变量值:存放数据,用来记录现实世界中的某种状态。
常量
计算机语言便设计了常量这个概念,也就是说常量相对于变量是一个不会变化的量。在Python中,虽然也和其他很多计算机语言一样拥有常量这个概念,但更多的是约定俗成的,Python并没有严格的对常量进行控制,只是规定常量名必须全部大写。
一、变量存哪了?
也就是说变量是存放在内存当中的。
二、Python垃圾回收机制
2.1 引用计数
引用计数这个概念,当相同的变量值被赋予不同的变量名时,变量值每增加一个变量名的赋予,则该变量值的引用计数加1
更严谨的讲,只有当一个变量值每一次被直接或间接引用时,引用计数才会增加,在Python中让引用计数增加共有三种方法:
1变量被创建,变量值引用计数加1
2变量被引用,变量值引用计数加1
3变量作为参数传入到一个函数,变量值引用计数加2
import sys
# 引用计数初始值为3
print(sys.getrefcount(2021)) # 输出为3
# 变量被创建,变量值引用计数加1
year = 2021
print(sys.getrefcount(2021)) # 输出为4
# 变量被引用,变量值引用计数加1
height = year
print(sys.getrefcount(2021)) # 输出为5
# 变量作为参数传入到一个函数,变量值引用计数加2
def func(year):
print(sys.getrefcount(year))
func(year) # 输出为7
Python中既然有增加引用计数的方法, 也当然会减少引用计数的方法,共有以下4种:
变量值对应的变量名被销毁
变量值对应的变量名被赋予新的值
变量值对应的变量名离开它的作用域
变量值对应的变量名的容器被销毁
import sys
print(sys.getrefcount(2021)) # 输出为3
year = 2021
print(sys.getrefcount(2021)) # 输出为4
print(id(year)) # 输出4499932720
print(year) # 输出2021
year = 2022
print(sys.getrefcount(2021)) # 输出为3
print(id(year)) # 输出4499932560
print(year) # 输出2022
常量池
在上述各个知识的打通之后,现在可以正式引入常量池这个概念。上面讲到在Python中严格的讲是没有常量这个概念的,即使你通过约定俗成的方法定义了一个常量,但这个常量也只是一个变量,也就是说只要你对这个常量做出修改,这个常量原有对应的常量值引用计数就会变成0,由于常量等同于变量,它一样会被Python垃圾回收机制回收。
但是在Python中,存在着一些例外,这些例外就是一个小整数池,顾名思义,小整数池表示的是从-5到256范围内的整数,这些整数定义出来后就是一个常量,也就是说他们的引用计数即使为0,也不会被Python的垃圾回收机制回收,可以通过下述实例验证:
import sys
first_l = [] # 定义列表l存储[-5,256]中的所有整数的引用计数
add_l = [] # 定义列表add_l存储[-5,256]中的所有整数的引用计数加1后的引用计数
del_l = [] # 定义列表del_l存储[-5,256]中的所有整数的引用计数减1后的引用计数
for i in range(-5, 256):
first_l.append(sys.getrefcount(i))
add = i
add_l.append(sys.getrefcount(i))
del add
del_l.append(sys.getrefcount(i))
first_l.sort()
add_l.sort()
del_l.sort()
print(f'min(first_l): {min(first_l)}') # 获取[-5,256]中所有整数的最小引用计数,输出为4
print(f'min(add_l): {min(add_l)}') # 获取[-5,256]中所有整数的最小引用计数,输出为5
print(f'min(del_l): {min(del_l)}') # 获取[-5,256]中所有整数的最小引用计数,输出为4
标签:变量,常量,Python,变量值,sys,计数,引用,print,内存
From: https://www.cnblogs.com/aidd/p/17426589.html