aidd

导航

 

博客随笔皆为学习笔记,有诸多不足,如有错误,请帮我指出,不胜感激
变量
三个组成部分:
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
posted on 2023-05-23 22:22  开源共享  阅读(28)  评论(0编辑  收藏  举报