【python中的对象存储:堆?栈?】

news2024/12/23 17:44:15

在这里插入图片描述

堆空间和栈空间

堆空间和栈空间是计算机内存中的两个存储区域,主要的区别有以下几点:

  1. 分配方式:栈空间中的内存由编译器或解释器自动分配和释放,无需手动干预。堆空间中的内存则需要由程序员手动申请和释放。
  2. 内存大小:栈空间通常比堆空间小,而且大小是固定的。堆空间则可以根据需要动态分配和释放内存,大小相对较大。
  3. 存储方式:栈空间采用“先进后出”的存储方式,也就是说,最后进入栈空间的数据最先被处理,先进入栈空间的数据最后被处理。堆空间则没有这种先后顺序,数据可以随时存取和修改。
  4. 存储内容:栈空间通常用于存储局部变量、函数参数、函数调用信息等。堆空间则用于存储动态分配的内存,例如使用 malloc()calloc()realloc() 等函数申请的内存。

总之,堆空间和栈空间都是计算机内存中的存储区域,其主要区别在于分配方式、内存大小、存储方式和存储内容等方面。了解堆空间和栈空间的区别可以帮助程序员更好地管理内存,避免出现内存泄漏、栈溢出等问题。

python存储

在 Python 中,所有的变量都是对象,对象在内存中存储的位置可以是堆空间或栈空间,具体取决于对象的类型和使用方式。

一般来说,Python 中的数字、字符串等基本类型的对象都存储在栈空间中,而复杂的对象如列表、字典、对象实例等则存储在堆空间中。当这些对象被作为参数传递给函数时,它们的引用会被压入栈空间中,函数返回时再从栈空间中弹出这些引用,但实际的对象并没有被复制,仍然存在于堆空间中。

# 数字、字符串等基本类型的对象存储在栈空间中
a = 1  # a 存储在栈空间中,值为 1
b = "hello"  # b 存储在栈空间中,值为 "hello"

# 列表、字典等复杂类型的对象存储在堆空间中
c = [1, 2, 3]  # c 存储在栈空间中,指向的对象 [1, 2, 3] 存储在堆空间中
d = {"name": "Alice", "age": 20}  # d 存储在栈空间中,指向的对象 {"name": "Alice", "age": 20} 存储在堆空间中

# 对象实例也存储在堆空间中
# 类定义本身是在编译时创建的,因此类本身是存储在代码段中的。但是,当创建类的实例时,实例对象是动态分配的,其大小不固定,需要存储在堆空间中。
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

e = Person("Bob", 30)  # e 存储在栈空间中,指向的对象 Person("Bob", 30) 存储在堆空间中

需要注意的是,Python 中的垃圾回收机制会自动管理堆空间中的内存,当堆空间中的对象不再被引用时,垃圾回收机制会自动回收这些内存,释放给操作系统。而栈空间中的内存则由编译器或解释器自动管理,当栈空间中的变量超出作用域或函数返回时,这些变量所占用的内存就会被自动释放。

在 Python 中,列表和字典等复杂类型的对象是动态分配的,其大小不固定。为了方便存储和管理,这些对象通常存储在堆空间中。

当定义一个列表或字典时,Python 会先在栈空间中分配一块空间,用于存储该变量的引用。该引用指向一个在堆空间中分配的内存块,该内存块中存储了实际的列表或字典对象。因为列表和字典等对象的大小不固定,可能需要动态地调整内存大小,所以通常使用动态内存分配方式,即在堆空间中分配一块较大的内存池,然后根据实际需要动态地申请和释放内存块。

需要注意的是,在 Python 中,对象的引用和实际的对象是分开存储的,因此,当多个变量引用同一个对象时,它们都指向同一个内存块。这也就意味着,当其中一个变量改变了对象的值时,其他引用该对象的变量也会受到影响。这种引用方式在 Python 中被称为“对象引用语义”,与其他编程语言的“值传递语义”不同。

题外话1

在 Python 中,类的生命周期指的是从类被创建到被销毁的整个过程。在程序运行时,当 Python 解释器遇到类定义语句时,会创建一个类对象,并将其存储在代码段中。类对象包含了类的属性和方法等信息,并可以用于创建类的实例对象。

类对象的生命周期与程序的运行周期一致,即从程序开始运行到程序结束。在程序运行期间,类对象一直存在于内存中,可以用于创建多个实例对象,调用类的方法等操作。当程序运行结束时,Python 解释器会自动销毁类对象,并释放其占用的内存空间。

需要注意的是,类的生命周期与实例对象的生命周期是不同的,它们是独立的对象,存储在不同的空间中,具有不同的生命周期。类对象的创建和销毁由 Python 解释器自动管理,程序员无需手动干预。

题外话2

在 Python 中,数字、字符串等基本类型的对象都是不可变的,其大小是固定的,因此可以直接存储在栈空间中。

栈空间通常用于存储函数调用时的局部变量和函数参数等信息。当函数被调用时,操作系统会为函数分配一块栈空间,用于存储函数调用时需要使用的局部变量和参数等信息。这些信息通常是在函数调用时创建的,当函数返回时,栈空间也会被自动销毁,这样可以确保内存的高效使用和安全性。

在 Python 中,数字、字符串等基本类型的对象都是不可变的,它们的值在创建后就不会发生变化。因此,Python 可以将它们直接存储在栈空间中,不需要像列表、字典等可变类型一样,动态调整内存大小,从而提高了程序的执行效率。而对于可变类型的对象,Python 通常会将它们存储在堆空间中,这样可以动态调整内存大小,确保程序的灵活性和可靠性。

题外话3

栈是一种具有后进先出(Last In First Out)特性的数据结构,它非常适合用于存储函数调用时的局部变量和函数参数等信息。这是因为函数调用过程中,会按照调用顺序依次进入栈中,而在函数返回时,则会按照相反的顺序依次从栈中弹出。因此,栈空间被广泛应用于函数调用和局部变量存储的原因,主要有以下几个方面:

  1. 快速分配和回收内存:栈空间的大小通常是固定的,由操作系统预先分配好,因此在使用栈空间时,可以快速地分配和回收内存空间,不需要像堆空间那样进行复杂的内存管理。
  2. 访问速度快:由于栈空间是连续的内存块,访问起来非常快速,而且在 CPU 中已经内置了栈指针,因此对于栈的操作也比较高效。
  3. 存取方式简单:栈空间只允许在栈顶进行存取操作,因此存取方式非常简单,不需要像堆空间那样进行指针操作等。
  4. 便于实现递归:由于函数调用过程本质上也是一种递归调用,栈空间可以很方便地实现递归操作,而且由于栈空间的大小固定,可以很好地控制递归的深度和内存的使用。

总之,栈空间由于具有快速分配和回收内存、访问速度快、存取方式简单、便于实现递归等优点,因此非常适合用于存储函数调用时的局部变量和函数参数等信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/466424.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

招商基金数字化转型下的研发管理|发布会精彩回顾

在 4 月 20 日举行的《中国企业软件研发管理白皮书》发布会上,招商基金信息技术部副总监、研发中心主管刘志昆作了《招商基金数字化转型下的研发管理》主题演讲,从数字化转型背景、研发管理所遇到的挑战出发,讲述招商基金如何摸索出适合自身环…

Java多线程与锁

前文中,我们已经了解了什么是线程,线程间常用通信方式,线程池以及其相关特性,可以看出锁在多线程环境中充当着重要作用,不管是线程间的数据通信,还是线程间的等待和唤醒,都依赖于锁,…

《编码——隐匿在计算机软硬件背后的语言》精炼——第13-14章(二进制减法器——1位存储器)

“成功不是最终的,失败不是致命的,勇气才是最关键的。” - 温斯顿丘吉尔 文章目录 如何实现减法计算机进行减法运算的逻辑借位的代替机制二进制下的替代机制 减法的电路实现 反馈与触发器电铃触发器R-S触发器 电平触发的D型触发器 如何实现减法 计算机进…

Haproxy搭建Web群集

Haproxy 支持四层和七层反向代理 LVS 支持四层反向代理 目前常见的Web集群调度器分为软件和硬件软件通常使用开源的LVS、Haproxy、Nginx硬件一般使用比较多的是F5,也有很多人使用国内的一些产品,如梭子鱼、绿盟等;云 SLB CLB Haproxy应用分析…

配置Docker镜像加速器-Docker命令-Docker 容器的数据卷

Docker架构 docker进程(daemon) 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件…

OpenJudge - 39:多项式输出

目录 一、题目描述 二、代码实现 一、题目描述 一元 n 次多项式可用如下的表达式表示: ​ 其中,​ 称为 i 次项,​ 称为 i 次项的系数。给出一个一元多项式各项的次数和系数,请按照如下规定的格式要求输出该多项式&#xff…

如何在本地搭建Maven环境并整合进IDEA中?【2023最新版】

编译软件:IntelliJ IDEA 2019.2.4 x64 操作系统:win10 x64 位 家庭版 Maven版本:apache-maven-3.6.3 目录 一. 为什么要使用Maven?1.1 获取jar包1.2 添加jar包1.3 使用Maven便于解决jar包冲突及依赖问题 二. 什么是Maven?三. 如何…

排序算法 - 选择排序(Selection sort)

文章目录 选择排序介绍选择排序实现选择排序的时间复杂度和稳定性选择排序时间复杂度选择排序稳定性 代码实现核心&总结 每日一道算法,提高脑力。第四天,选择排序。 选择排序介绍 它的基本思想是: 首先在未排序的数列中找到最小(or最大)元素&#…

Three.js--》理解光源对物体产生影响的重要性

上篇文章 前端开发者掌握3d技术不再是梦,初识threejs 作为three.js入门篇讲解了许多内容但是没有深入了解其原理以及实现方法,仅仅只是展示了实现的内容及代码,本篇文章将深入讲解实现效果其背后用到的知识与原理。 目录 使用相机控件轨道控…

博途PID编程应用(状态机)

博途工艺PID的详细解读可以查看下面的博客文章,这里不再赘述 博途PLC 1200/1500PLC 工艺对象PID PID_Compact详细解读_RXXW_Dor的博客-CSDN博客这篇博文我们详细解读博途PLC自带的PID功能块PID_Compact,大部分工业闭环调节过程,我们采用系统自带的PID功能块基本都能胜任,一…

接收来自客户端的参数使用【JSR303校验框架】进行校验参数是否合法

目录 1:JSR303校验 1.1:统一校验的需求 1.2:统一校验实现 1.3:分组校验 1.4:校验规则不满足? 1:JSR303校验 1.1:统一校验的需求 前端请求后端接口传输参数,是在co…

CTFShow-Web篇详细wp(持续更新中ing)

CTFShow-Web篇详细wp web签到题web2web3web4web5web6web7web8 CTFShow 平台:https://ctf.show/ web签到题 直接F12然后Base64解码 ctfshow{19bdf375-f974-481e-8c62-0f4c3d170fb4} web2 考点:联合查询 先尝试使用万能密码登入 ‘ or 11# 登入成功&am…

搭建家庭影音媒体中心 --公网远程连接Jellyfin流媒体服务器

文章目录 前言1. 安装Home Assistant2. 配置Home Assistant3. 安装cpolar内网穿透3.1 windows系统3.2 Linux系统3.3 macOS系统 4. 映射Home Assistant端口5. 公网访问Home Assistant6. 固定公网地址6.1 保留一个固定二级子域名6.2 配置固定二级子域名 转载自远程穿透的文章&…

dig命令理解DNS域名解析中的A记录,AAAA记录,CNAME记录,MX记录,NS记录,/etc/hosts本地域名IP映射

参考博文:https://blog.csdn.net/zxl1990_ok/article/details/125432123 目录 参考资料DNS简介/etc/hosts本地域名IP映射查询过程举例直接显示DNS寻址结果向特定DNS服务器寻址查询A记录查询AAAA记录CNAME记录MX记录NS记录PTR记录SOA记录查看DNS服务器的主从关系 参考…

外网SSH远程连接linux服务器,看这一篇就够了

文章目录 视频教程1. Linux CentOS安装cpolar2. 创建TCP隧道3. 随机地址公网远程连接4. 固定TCP地址5. 使用固定公网TCP地址SSH远程 转载自内网穿透工具的文章:无公网IP,SSH远程连接Linux CentOS服务器【内网穿透】 本次教程我们来实现如何在外公网环境下…

【SWAT水文模型】SWAT水文模型建立及应用第二期:土地利用数据的准备

SWAT水文模型建立及应用:土地利用数据的准备 1 简介2 土地利用数据的下载2.1 数据下载方式2.1.1 中科院1km土地利用数据2.1.2 清华大学高精度土地利用数据 2.2 数据下载 3 土地利用数据的准备3.1 矢量转栅格3.2 土地利用类型的重分类3.3 土地利用分布图投影调整3.4 …

数据库系统-并发控制

文章目录 一、为什么要并发控制1.2 并发控制解决的问题1.2.1 脏读1.2.2 幻读1.2.3 不可重复读1.2.4 数据丢失问题 二、事务调度及可串行性2.1 事务2.1.1 事务的宏观2.1.2 事务的微观2.1.3 事务的特性 ACID 2.2 事务调度与可串行性2.3 冲突可串行化判定 三、基于封锁的并发控制方…

DNS基础:通过dig命令理解DNS域名解析中的A记录,AAAA记录,CNAME记录,MX记录,NS记录,/etc/hosts本地域名IP映射

参考博文:https://blog.csdn.net/zxl1990_ok/article/details/125432123 目录 参考资料DNS简介/etc/hosts本地域名IP映射查询过程举例直接显示DNS寻址结果向特定DNS服务器寻址查询A记录查询AAAA记录CNAME记录MX记录NS记录PTR记录SOA记录查看DNS服务器的主从关系 参考…

博途PID1200/1500PLC编程应用(SCL状态机编程)

博途工艺PID的详细解读可以查看下面的博客文章,这里不再赘述 博途PLC 1200/1500PLC 工艺对象PID PID_Compact详细解读_RXXW_Dor的博客-CSDN博客这篇博文我们详细解读博途PLC自带的PID功能块PID_Compact,大部分工业闭环调节过程,我们采用系统自带的PID功能块基本都能胜任,一…

【Linux】第八讲:Linux进程信号详解(一)_ 认识信号 | 产生信号

「前言」文章是关于Linux进程信号方面的知识,本文的内容是Linux进程信号第一讲,讲解会比较细,下面开始! 「归属专栏」Linux系统编程 「笔者」枫叶先生(fy) 「座右铭」前行路上修真我 「枫叶先生有点文青病」 「每篇一句」 人生天…