探索 Python 的动态类型系统:变量引用、不可变性及高效内存管理与垃圾回收机制的深入分析

server/2024/10/18 23:27:18/

文章目录

    • 1. 动态类型及其内存管理解析
      • 1.1 变量与对象的引用关系
      • 1.2 对象的不可变性和内存地址的变化
    • 2. 垃圾回收与内存优化策略

Python作为一种流行的高级编程语言,以其代码的易读性和简洁性著称。尤其是它的动态类型系统和自动内存管理,使得开发者可以更加专注于实现功能而非处理底层细节。下面就来讲讲,今天面试被问到了。


1. 动态类型及其内存管理解析

Python 作为一种动态类型的编程语言,允许开发者在声明变量时不需要指定数据类型。此外,Python 中的一切皆为对象,变量则是对这些对象的引用。

1.1 变量与对象的引用关系

同一个对象可以被多个变量引用

python"># 创建变量 x 并赋值为 10
x = 10
print("变量 x 的类型:", type(x)) # 变量 x 的类型: <class 'int'># 创建变量 y,将其引用设置为变量 x 的引用
y = x
print("x 引用的对象地址:", hex(id(x))) # 0x7ff0ab01a3d0
print("y 引用的对象地址:", hex(id(y)))# 0x7ff0ab01a3d0

xy 都引用了同一个整数对象 10

补充:hex() 用于将一个整数转换成对应的十六进制字符串

1.2 对象的不可变性和内存地址的变化

修改 x 的值,并观察 xy 的引用是否发生变化:

python"># 修改变量 x 的值
x += 1
print("修改后 x 的地址:", hex(id(x))) # 修改后 x 的地址: 0x7ff0ab01a3f0

当对 x 进行加 1 操作时,由于整数是不可变类型,x 指向了一个新的整数对象 11,而原有的整数对象 10 保持不变。

2. 垃圾回收与内存优化策略

Python的动态类型允许程序在运行时创建、修改和销毁对象,这种灵活性虽然提供了极大的便利,但也带来了对内存管理机制的依赖。

2.1 动态内存分配的基础

在 Python 中,变量在创建时不需要声明数据类型,因此,Python 需要在运行时动态地管理内存。这主要通过堆内存来实现,其中对象的创建、修改和销毁都在堆内存中进行。

python">def bar(a):a = a - 1return adef foo(a):a = a * ab = bar(a)return bdef main():x = 2y = foo(x)if __name__ == "__main__":main()

main 函数被调用时,局部变量 xy 被创建并存储在调用栈上,而通过 foobar 函数创建的对象则存储在堆上。当 foobar 函数执行完毕后,它们可能会在堆上留下未被回收的对象,这就是动态内存管理中需要解决的问题。

运行时:

在这里插入图片描述

运行结束:

在这里插入图片描述

2.2 Python 的垃圾回收

Python 通过一个内置的垃圾收集器来管理内存,它主要使用引用计数和标记-清除算法来追踪和清除不再使用的对象。

引用计数: Python 对每个对象维护一个引用计数,每当对象的引用数变为零时,该对象就会被垃圾收集器回收。

python">import sysclass Color:def __init__(self, r, g, b):self.red = rself.green = gself.blue = bclr = Color(255, 0, 0)
print("clr 对象的引用计数:", sys.getrefcount(clr) - 1)  
# 减1是因为getrefcount在调用时也会增加一次引用计数

循环引用问题: 引用计数方法不能处理对象间的循环引用,例如两个对象互相引用。


推荐: python 错误记录
参考:Python Memory Management


http://www.ppmy.cn/server/15968.html

相关文章

Oracle 21 C 安装详细操作手册,并配置客户端连接

Oracle 21 C 安装详细操作手册 Win 11 Oracle 21C 下载&#xff1a; Database Software Downloads | Oracle 中国 云盘共享 链接&#xff1a;https://pan.baidu.com/s/12XCilnFYyLFnSVoU_ShaSA 提取码&#xff1a;nfwc Oracle 21C 配置与登陆&#xff1a; 开始菜单 NetMa…

MATLAB初学者入门(15)—— 随机森林

随机森林是一种强大的机器学习方法&#xff0c;基于多个决策树的训练结果进行集成学习&#xff0c;以提高整体的预测准确性和稳定性。这种方法不仅适用于分类问题&#xff0c;也非常适合于回归问题。MATLAB中的Statistics and Machine Learning Toolbox提供了易于使用的随机森林…

使用 ollama 部署最新的Llama 3 70B本地模型

一、ollama是什么? 在本地启动并运行大型语言模型。运行Llama 3&#xff0c;Mistral, Gemma, Code Llama和其他模型。自定义并创建您自己的。 综合优点&#xff1a; 快速下载容器自动运行大模型&#xff0c;现在下载&#xff0c;马上上手。本地利用 cpu 运行大模型&#xff0c…

【UnityShader入门精要学习笔记】第十一章 Shader动画

本系列为作者学习UnityShader入门精要而作的笔记&#xff0c;内容将包括&#xff1a; 书本中句子照抄 个人批注项目源码一堆新手会犯的错误潜在的太监断更&#xff0c;有始无终 我的GitHub仓库 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 文章目录 UnityShad…

Git如何将另一个repo以子模块形式引入

如题&#xff0c;最近遇到个小问题&#xff0c;即如何在当前仓库中引用另一个仓库的一些代码和工具。突然想起Git的submodule功能&#xff0c;并成功实现了该想法&#xff0c;在此做个记录&#xff1a; Git允许通过使用git submodule命令将一个Git仓库作为另一个Git仓库的子模块…

CSS详解(二)

接上篇CSS详解&#xff08;一&#xff09;-CSDN博客 1、网页布局本质 网页布局的本质是通过 CSS 将各种 HTML 元素&#xff08;即“盒子”&#xff09;摆放到页面中合适的位置。这包括设置元素的尺寸、位置、边距、填充、对齐方式、浮动等。这些盒子通过 CSS 的各种布局机制进…

二轴机器人大米装箱机的工作原理与应用

在现代化农业和工业生产中&#xff0c;自动化和智能化设备的应用已经成为提高效率、降低成本的重要手段。二轴机器人大米装箱机便是这一趋势下的杰出代表&#xff0c;它凭借精准的操作和高效的工作流程&#xff0c;正在改变着大米装箱的传统作业方式。 一、二轴机器人大米装箱…

设计模式-23种基础模式目录

种一棵树最好的时间点是十年前&#xff0c;其次是现在 —— Dambisa Moyo《dead aid》 对软件设计来说&#xff0c;23种基本设计模式就像象棋里面的基本杀法一样。就算你从来没学过基本杀法&#xff0c;从来没听说过二鬼拍门、八角马和双车错这种专业术语&#xff0c;也不代表你…