首页 > 系统相关 >Python变量内存管理

Python变量内存管理

时间:2023-05-23 22:34:35浏览次数:41  
标签:变量 常量 Python 变量值 sys 计数 引用 print 内存

变量
三个组成部分:
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

相关文章

  • 深入理解 python 虚拟机:花里胡哨的魔术方法
    深入理解python虚拟机:花里胡哨的魔术方法在本篇文章当中主要给大家介绍在cpython当中一些比较花里胡哨的魔术方法,以帮助我们自己实现比较花哨的功能,当然这其中也包含一些也非常实用的魔术方法。深入分析hash方法在Python中,__hash__()方法是一种特殊方法(也称为魔术方法......
  • Python - yarl
    https://www.jb51.net/article/265713.htmhttps://blog.csdn.net/lly1122334/article/details/127493377......
  • python:Error: EPERM: operation not permitted, mkdir 'F:\Program Files\nodejs\
     可以发现文件没有权限npmERR!Error:EPERM:operationnotpermitted,mkdir'F:\ProgramFiles\nodejs\node_global\node_modules'将nodejs的文件权限改为完全控制之后操作即可 ......
  • Tkinter 中隐藏和取消隐藏第二窗口窗口 – Python,用于多界面窗口程序
    在Tkinter中隐藏和取消隐藏窗口–Python先决条件: TkinterPython为开发GUI(图形用户界面)提供了多种选择。在所有GUI方法中,Tkinter是最常用的方法。它是Python附带的TkGUI工具包的标准Python接口。PythonwithTkinter是创建GUI应用程序的最快、最简单的方法。使......
  • Python学习
    3-13字符串类型字符串类型:str   1.定义格式:       变量='内容'           打印一行       变量="内容"           打印一行       变量='''内容'''或者三引号           可以通过回车的方式换行,且打印出......
  • Python函数
    1.函数函数是什么?函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,具体区别,我们后面会讲,编程中的函数在英文中也有很多不同的叫法。在BASIC中叫做subroutine(子过程或子程序),在Pascal中叫做procedure(过程)和function,在C中只有function,在Java里......
  • python生成13位或16位时间戳以及反向解析时间戳
    importdatetimeimporttimedefget_float_time_stamp():datetime_now=datetime.datetime.now()returndatetime_now.timestamp()defget_time_stamp16():#生成16时间戳eg:1540281250399895-lndatetime_now=datetime.datetime.now()print(datetim......
  • python 基础day09 字符编码
    字符编码前提:字符编码只跟文本数据和字符串有关系,他跟视频文件、音频文件等无关为什么要有字符编码?计算机内部只认识01二进制数据,但是,我们现在在计算机上写的各种各样的字符,为什么都能正常显示?字符编码:它的内部记录着字符和数字之间的对应关系eg:0--->a1---->b00--->aa0......
  • vue中使用scss公共变量的方法 :export
    vue中使用scss公共变量的方法:export:https://blog.csdn.net/weixin_44698285/article/details/124051066?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-124051066-blog-125074100.235%5Ev36%5Epc_relevant_def......
  • 内存映射大文件
    对于一些小文件,用普通的文件流就可以很好的解决,可是对于超大文件,比如2G或者更多,文件流就不行了,所以要使用API的内存映射的相关方法,即使是内存映射,也不能一次映射全部文件的大小,所以必须采取分块映射,每次处理一小部分。先来看几个函数CreateFile:打开文件GetFileSize:获取文件......