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

ops/2024/10/18 23:23:13/

文章目录

    • 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/ops/15776.html

相关文章

【postgresql初级使用】updatable view 可修改的视图,以及视图数据致性的控制,完全分离数据报表业务与数据的维护操作部署架构尝试

可修改的视图 ​专栏内容: postgresql使用入门基础手写数据库toadb并发编程个人主页:我的主页 管理社区:开源数据库 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. 文章目录 可修改的视图概述 可修改视图介绍

【Python数据库】Redis

文章目录 [toc]数据插入数据查询数据更新数据删除查询存在的所有key 个人主页&#xff1a;丷从心 系列专栏&#xff1a;Python数据库 学习指南&#xff1a;Python学习指南 数据插入 from redis import Redisdef insert_data():redis_cli Redis(hostlocalhost, port6379, db…

【力扣】977. 有序数组的平方

977. 有序数组的平方 题目要求很简单&#xff0c;解题的逻辑也清晰&#xff0c;就是将数组做一个升序排序。但是注意&#xff0c;题目要求时间复杂度为 O(n)&#xff0c;这样就打消了调用 Java 库内置的排序方法的念头了。一般我们看到这种对时间复杂度有要求的题目&#xff0c…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之三 简单人脸眼睛检测添加睫毛效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之三 简单人脸眼睛检测添加睫毛效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之三 简单人脸眼睛检测添加睫毛效果 一、简单介绍 二、简单人脸眼睛检测添加…

关于Gitea 的简单介绍

在数字化时代&#xff0c;代码托管已成为软件开发的不可或缺的一部分。对于开源项目或企业内部开发团队而言&#xff0c;选择一款合适的代码托管平台至关重要。Gitea&#xff0c;作为一款开源的轻量级代码托管平台&#xff0c;以其易用性、高性能和灵活性&#xff0c;受到了越来…

JS - 以工厂模式和原型模式方式建造对象、JS的垃级回收机制、数组的使用

创建对象的方式 使用工厂方法来建造对象 在JS中我们可以通过以下方式进行创建对象&#xff1a; var obj {name:"孙悟空",age:18,gender:"男",sayName:function(){alert(this.name);}};var obj2 {name:"猪八戒",age:28,gender:"男",…

STM32之HAL开发—— SRAM控制原理

SRAM&#xff08;Static Random-Access Memory&#xff09; 静态随机存取存储器&#xff08;Static Random-Access Memory&#xff0c;SRAM&#xff09;是随机存取存储器的一种。所谓的“静态”&#xff0c;是指这种存储器只要保持通电&#xff0c;里面储存的数据就可以恒常保…

Baumer工业相机堡盟工业相机如何通过NEOAPISDK使用PnPEventHandler实现相机掉线自动重连 (C#)

Baumer工业相机堡盟工业相机如何通过NEOAPISDK使用PnPEventHandler实现相机掉线自动重连 &#xff08;C#&#xff09; Baumer工业相机Baumer工业相机NEOAPI SDK和PnPEventHandler事件函数的技术背景Baumer工业相机通过NEOAPISDK使用PnPEventHandler实现相机掉线自动重连功能1.引…