当前位置: 首页 > news >正文

Python 垃圾回收机制全解析:内存释放与优化

在编写高效、稳定的 Python 程序时,内存管理往往是一个被忽视但至关重要的领域。对于 Python 开发者来说,最初的学习曲线通常集中在语法、库使用和应用框架上,而对于内存管理和垃圾回收(GC,Garbage Collection)的深入理解,却往往是在项目遇到内存泄漏或性能瓶颈时才引起重视。

Python 的垃圾回收机制背后蕴含着一个精妙的设计。它通过自动化的内存管理,帮助开发者避免手动管理内存的繁琐,同时也能在不留意的情况下引发内存泄漏或性能下降问题。因此,理解 Python 的内存回收机制,并对其进行优化,是提升程序性能、降低内存消耗的必备技能。

本文将全面解析 Python 的垃圾回收机制,揭示它的工作原理、优势与局限,进而提供如何在实践中优化内存管理和性能的实用技巧。


一、Python 垃圾回收的基本原理

Python 的内存管理系统由两大组成部分构成:

  1. 引用计数(Reference Counting)

  2. 循环垃圾回收(Cycle Garbage Collection)

这两者共同协作,确保 Python 程序的内存使用效率,防止出现内存泄漏。

1.1 引用计数:最基本的内存管理机制

Python 对象的内存管理基于引用计数。每当一个对象被创建时,Python 会为其分配内存,并为该对象设置一个引用计数器。每当一个新的引用指向该对象时,引用计数增加;而当一个引用不再指向该对象时,引用计数减少。当某个对象的引用计数为零时,意味着该对象不再被使用,Python 将自动释放它所占用的内存空间。

示例:引用计数
import sysa = []  # 创建一个列表对象,引用计数为1
print(sys.getrefcount(a))  # 输出引用计数b = a  # b 也引用了 a,引用计数为2
print(sys.getrefcount(a))del a  # 删除 a 引用,引用计数减少为1
print(sys.getrefcount(b))del b  # 删除 b 引用,引用计数为0,对象被销毁

启发:虽然引用计数能有效地管理内存,但它也有局限。循环引用问题无法通过引用计数自行解决,这是垃圾回收机制引入循环垃圾回收的原因。


1.2 循环垃圾回收:应对复杂引用

循环引用指的是两个或多个对象相互引用,形成闭环,即使这些对象在外部没有任何引用,它们的引用计数也无法归零,从而无法被释放。

例如,两个对象 ab 互相引用,当它们之间的引用计数不为零时,它们无法被垃圾回收。

示例:循环引用
class A:def __init__(self):self.ref = Nonea = A()
b = A()
a.ref = b
b.ref = a

在这个示例中,ab 互相引用,它们的引用计数不会归零,即便没有外部引用。循环垃圾回收通过 generational GC(分代垃圾回收)机制,定期扫描并清除这些循环引用对象。


二、Python 垃圾回收的实现:细节揭秘

Python 的垃圾回收不仅依赖引用计数,还通过分代垃圾回收机制优化了性能。垃圾回收在内存中会根据对象的生命周期将对象划分为不同的“代”——新生代老年代长期代

2.1 分代垃圾回收机制

分代垃圾回收的核心思想是:大部分对象的生命周期较短,只有少数对象会存在较长时间。因此,Python 通过将对象分为多个代(generation)来优化垃圾回收过程,减少频繁的回收操作对程序性能的影响。

  • 新生代(Generation 0):对象刚创建时,属于新生代。Python 会频繁地检查这一代的对象。

  • 老年代(Generation 1 和 Generation 2):如果一个对象在新生代存活了一定时间,它会被晋升到老年代。老年代的垃圾回收频率较低。

2.2 垃圾回收触发条件

  • 新生代 GC:每当新创建的对象达到一定数量时,Python 会触发一次垃圾回收。

  • 老年代 GC:老年代的回收触发频率较低,但它会根据历史垃圾回收周期和对象存活时间动态调整。

调试与控制垃圾回收

你可以通过 gc 模块手动控制和调试垃圾回收:

import gcgc.collect()  # 手动触发垃圾回收
gc.set_debug(gc.DEBUG_LEAK)  # 开启垃圾回收的调试信息

三、性能优化:如何减少垃圾回收的影响

垃圾回收,尤其是老年代回收,会对性能造成一定的影响。通过以下方法,可以优化程序性能,减少垃圾回收的消耗。

3.1 减少循环引用

减少对象间的循环引用是提升程序性能的关键。Python 的垃圾回收机制虽然可以自动清理循环引用,但高频繁的循环引用会增加垃圾回收的压力。

  • 使用 弱引用weakref)避免对象间的循环引用。

  • 优化数据结构,避免不必要的引用保持。

示例:使用弱引用
import weakrefclass A:def __init__(self):self.ref = Nonea = A()
b = weakref.ref(a)  # 使用弱引用

3.2 减少对象创建和销毁

频繁创建和销毁对象会增加垃圾回收的压力。通过对象池(Object Pool)等模式,减少对象的频繁创建和销毁,可以有效减少垃圾回收的负担。

3.3 定期手动回收

通过 gc.collect() 定期手动触发垃圾回收,尤其是在一些资源密集型任务中,能够有效控制内存占用,避免内存泄漏。


四、高级优化:结合内存分析与调优

4.1 内存泄漏分析

在长时间运行的 Python 程序中(如 Web 应用、爬虫等),内存泄漏是一个常见问题。使用内存分析工具(如 objgraphmemory_profiler)可以帮助找出不再使用的对象。

import objgraphobjgraph.show_growth()  # 显示当前内存中的对象增长情况

4.2 垃圾回收与多线程

多线程程序可能会引起垃圾回收的不一致问题。使用 gc 模块配合多线程时,务必确保垃圾回收机制的线程安全性,避免潜在的内存问题。


五、结语:内存管理是程序优化的灵魂

Python 的垃圾回收机制为开发者提供了强大的自动内存管理能力,减少了开发者对内存管理的关注。然而,这并不意味着可以忽视内存回收和优化。了解 Python 垃圾回收的原理和机制,掌握内存优化技巧,将有助于开发高效、稳定的应用程序。

垃圾回收机制不仅仅是一个工具,它是理解程序性能、设计高效系统和解决复杂问题的关键。希望本文的深入解析能为你开启新的思维方式,并启发你在开发中更加关注内存管理与优化,为代码性能提升提供思路和工具。

相关文章:

Python 垃圾回收机制全解析:内存释放与优化

在编写高效、稳定的 Python 程序时,内存管理往往是一个被忽视但至关重要的领域。对于 Python 开发者来说,最初的学习曲线通常集中在语法、库使用和应用框架上,而对于内存管理和垃圾回收(GC,Garbage Collection&#xf…...

性能优化实践

4.1 大规模量子态处理的性能优化 背景与问题分析 量子计算中的大规模量子态处理(如量子模拟、量子态可视化)需要高效计算和实时渲染能力。传统图形API(如WebGL)在处理高维度量子态时可能面临性能瓶颈,甚至崩溃(如表格中14量子比特时WebGL的崩溃)。而现代API(如WebGPU…...

opentelemetry笔记

span https://github.com/open-telemetry/opentelemetry-cpp/blob/f987c9c094f276336569eeea85f17e361de5e518/sdk/src/trace/span.h 在 OpenTelemetry C 的 sdk/src/trace 目录中,不同的 span 定义和实现是为了支持追踪(Tracing)功能的多样…...

【JavaScript】二十一、日期对象

文章目录 1、实例化日期对象2、相关方法3、时间戳4、案例:毕业🎓倒计时效果 1、实例化日期对象 获得当前时间 const date new Date()获得指定时间 const date new Date(2025-4-14 20:46:00) console.log(date)2、相关方法 方法作用说明getFullYear…...

GIT工具学习【1】:新安装git预操作

目录 1.写在前面2.为常用指令配置别名3.初始化4.解决中文乱码问题 1.写在前面 新安装git命令后,需要一些设置会用的比较的顺畅。 这篇文章只要跟着做即可,至于原理,后面会写清楚的。 2.为常用指令配置别名 #新建一个.bashrc touch ~/.bash…...

docker安装ES

ES安装步骤 1. 创建docker网络,使其docker内部通信 2. 下载 | 导入镜像文件(ES Kibana) 3. 创建容器,并访问 4. 安装Ik分词器(es对中文并不友好,所以需要安装IK分词使其适配中文) 1. 创建docke…...

【控制学】控制学分类

【控制学】控制学分类 文章目录 [TOC](文章目录) 前言一、工程控制论1. 经典控制理论2. 现代控制理论 二、生物控制论三、经济控制论总结 前言 控制学是物理、数学与工程的桥梁 提示:以下是本篇文章正文内容,下面案例可供参考 一、工程控制论 1. 经典…...

人工智能应用开发中常见的 工具、框架、平台 的分类、详细介绍及对比

以下是人工智能应用开发中常见的 工具、框架、平台 的分类、详细介绍及对比: 一、工具(Tools) 定义:用于完成特定任务的软件或库,通常专注于开发流程中的某个环节(如数据处理、模型调试、部署等&#xff…...

Linux磁盘格式化(mkfs、mkfs.xfs、mkfs.ext4)、Linux文件系统的校验(xfs_repair、fsck_ext4)

在Linux系统中,磁盘格式化和文件系统校验是系统管理的重要任务。以下是关键步骤和命令的总结: 磁盘格式化 1. 选择文件系统类型 XFS:适用于大文件和高并发场景,支持高性能和扩展性。ext4:成熟稳定的通用文件系统,适合大多数场景。2. 格式化命令 通用格式: sudo mkfs -…...

Android学习总结之git篇

Git 的原理时,你可以从数据结构、对象存储、引用管理、分支与合并等方面结合源码进行分析。以下是详细介绍: 1. 基本数据结构和对象存储 Git 底层主要基于四种对象来存储数据:blob(数据块)、tree(树&…...

Python基础语法——类型

目录 类型的意义动态类型静态类型 类型的意义 不同的类型,占用的内存空间是不同的. 占几个字节 int 默认是 4 个字节.动态扩容 float 固定 8 个字节 bool 一个字节就足够了 str 变长的 不同的类型,对应能够进行的操作也是不同的 int/float, “” “-” “ * ” “/”——不能使…...

vue2中基于el-select封装一个懒加载下拉框

需求 当下拉选项的数据量过大时&#xff0c;后端接口是分页格式返回数据。 解决方案 自定义封装一个懒加载下拉组件&#xff0c;每次滚动到底部时自动获取下一页数据&#xff0c;这样可有效防止数据量过大时造成组件卡顿。 具体实现步骤 1、创建懒加载下拉选择组件 <t…...

uniapp的h5,打开的时候,标题会一闪而过应用名称,再显示当前页面的标题

问题&#xff1a; 微信小程序&#xff0c;通过webview打开了uniapp创建的h5&#xff0c;但是打开h5时&#xff0c;会先显示h5的应用名称&#xff0c;然后才切换为该页面的标题。 过程&#xff1a; 查过很多资料&#xff0c;有说修改应用名称&#xff0c;有说设置navigationS…...

HarmonyOS 5 开发环境全解析:从搭建到实战

鸿蒙来了&#xff0c;从 1.0 到 5.0&#xff0c;它不再只是“华为的操作系统”&#xff0c;而是万物互联生态的核心驱动。作为开发者&#xff0c;你准备好拥抱这个全新时代了吗&#xff1f; 你是否还在犹豫&#xff1a;HarmonyOS 5 开发门槛高不高&#xff1f;该用 DevEco Stu…...

2.2 函数返回值

1.回顾def def sum(x,y): return xy res sum(10,20) #调用函数 print(res) 2.函数的三个重要属性 -函数的类型&#xff1a;function -函数的ID&#xff1a;16进制的整数数值 -函数的值&#xff1a;封装在函数中的数据和代码 # - 函数是一块内存空间&#xff0c;通过…...

OpenAI发布GPT-4.1:开发者专属模型的深度解析 [特殊字符]

最近OpenAI发布了GPT-4.1模型&#xff0c;却让不少人感到困惑。今天我们就来深入剖析这个新模型的关键信息&#xff01; 重要前提&#xff1a;API专属模型 &#x1f4bb; 首先需要明确的是&#xff0c;GPT-4.1仅通过API提供&#xff0c;不会出现在聊天界面中。这是因为该模型主…...

Cython中操作C++字符串

使用Cython开发Python扩展模块-CSDN博客中文末对python代码做了部分C优化&#xff0c;并提及未对字符串类型做优化&#xff0c;并且提到如果不是真正搞懂了C字符串的操作和Python的C API中与字符串相关的知识&#xff0c;最好不要动Python中的字符串类型。为了搞明白在Cython中…...

Dify插件内网安装,解决Dify1.x插件安装总失败问题,手把手教你暴力破解:从镜像源到二进制打包全攻略

背景 自从dify升级到1.0以后&#xff0c;所有的工具和模型都改成了插件化&#xff0c;需要进行插件的安装。在手撕Dify1.x插件报错&#xff01;从配置到网络到Pip镜像&#xff0c;一条龙排雷实录 已经指出了dify在线安装插件的各种问题。 首发地址 在前面的几个版本中&…...

二极管详解:特性参数、选型要点与分类

一、二极管的基本定义 二极管&#xff08;Diode&#xff09; 是由半导体材料&#xff08;如硅、锗&#xff09;构成的双端器件&#xff0c;核心特性是单向导电性。其结构基于PN结&#xff0c;正向偏置导通&#xff0c;反向偏置截止。 核心功能&#xff1a; 整流&#xff08;交…...

BufferedOutputStream 终极解析与记忆指南

BufferedOutputStream 终极解析与记忆指南 一、核心本质 BufferedOutputStream 是 Java 提供的缓冲字节输出流&#xff0c;继承自 FilterOutputStream&#xff0c;通过内存缓冲区显著提升 I/O 性能。 核心特性速查表 特性说明继承链OutputStream → FilterOutputStream → …...

Google政策大更新:影响金融,新闻,社交等所有类别App

Google Play 4月10日 迎来了2025年第一次大版本更新&#xff0c;新政主要涉及金融&#xff08;个人贷款&#xff09;&#xff0c;新闻两个行业。但澄清内容部分却使得所有行业都需进行一定的更新。下面&#xff0c;我们依次从金融&#xff08;个人贷款&#xff09;&#xff0c;…...

【Linux网络与网络编程】10.网络层协议IP

前言 我们之前谈的主机B把数据传递给主机C过程都是黑盒式的&#xff0c;即并没有考虑它的中间过程。本篇博客和下一篇博客将要考虑的问题是&#xff1a;主机B和主机C并不是直接连接的&#xff0c;主机B想要把数据传输给主机C需要经过若干路由器的。我们就引出了两个问题&#x…...

Docker 搭建 RabbitMQ

Docker 搭建 RabbitMQ 前言一、准备工作二、设置目录结构三、编写启动脚本四、Host 网络模式 vs Port 映射模式1. Host 网络模式2. Port 映射模式 五、端口配置对比六、配置示例七、查看与管理八、扩展与高可用九、常用命令 前言 在现代微服务与分布式架构中&#xff0c;Rabbi…...

浏览器自动化检测对抗:修改navigator.webdriver属性的底层实现

一、背景介绍&#xff1a;你被自动化检测拒之门外了吗&#xff1f; 在使用 Selenium 或 Playwright 等浏览器自动化工具爬取数据时&#xff0c;经常会遇到「被检测」问题&#xff0c;尤其像 Amazon 这样反爬策略严密的网站。常见的检测机制之一就是检查 JavaScript 中的 navig…...

聊聊Spring AI Alibaba的DocumentParser

序 本文主要研究一下Spring AI Alibaba的DocumentParser DocumentParser spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/document/DocumentParser.java public interface DocumentParser {/*** Parses a given {link InputStream} into a {link Document}. T…...

用css给div列表加个序号

用 CSS 的 counter 相关属性来为列表添加序号。以下是具体的代码&#xff0c;我将以 HTML 文件的形式提供&#xff0c;并且会运行展示效果&#xff1a; .as-div {// counter-reset: my-counter; /* 计数器名称是my-counter */// counter-reset: small-apple; /* 计数器名称是s…...

CSS标签选择器与类选择器

CSS标签选择器 标签选择器&#xff08;元素选择器&#xff09;是最基本的选择器之一&#xff0c;用于选择HTML文档中的特定标签元素并应用样式。它使用HTML标签名称作为选择器&#xff0c;选择匹配该标签的所有元素。 作用&#xff1a;通过HTML标签名选择元素 以下是CSS标签选…...

(51单片机)LCD显示日期时间时钟(DS1302时钟模块教学)(LCD1602教程)

目录 源代码 main.c LCD1602.c LCD1602.h DS1302.c DS1302.h 代码解析与教程&#xff1a; LCD1602模块 DS1302模块 效果视频&#xff1a; 源代码 如上图将5个文放在Keli5 中即可&#xff0c;然后烧录在单片机中就行了 烧录软件用的是STC-ISP&#xff0c;不知道怎么安装的…...

编译原理(自考13007)

资源内容 大纲 概述...

C#Winform程序将子窗体嵌入容器方法

private void OpenForm(Form childFrom) { //首先判断容器中是否有其他的窗体 foreach (Control item in this.panelRight.Controls) { if (item is Form) { ((Form)item).Close(); } } //嵌入新的窗体 childFrom.TopLevel false;//将子窗体设置成非顶级控件 childFrom.Parent…...

WPS JS宏编程教程(从基础到进阶)-- 第八部分:字符串技术与WPS结合应用

目录 第8章 字符串技术与WPS结合应用8-1 字符串的3种引用方式场景:动态生成报表标题三种引用方式对比代码解析表模板字符串核心优势8-2 字符串处理之切片与搜索场景:提取身份证中的出生年份三大截取方法对比方法选择指南索引搜索实战8-3 字符串处理之修改与填充场景:规范商品…...

WPS Office安卓版文档编辑功能与兼容性评测【高效编辑】

一、界面设计与操作体验 WPS Office安卓版采用简洁直观的界面设计&#xff0c;首页默认展示近期文档列表&#xff0c;支持一键新建文档、表格或演示文稿。整体操作逻辑与PC端保持一致&#xff0c;新用户也能快速上手。编辑工具栏设计合理&#xff0c;常用功能如字体设置、段落…...

【经验记录贴】使用配置文件提高项目的可维护性

mark一下。 整体修改前后如下&#xff1a; 课题&#xff1a; 在项目中有一个支持的文件类型的FILE_TYPE的定义&#xff0c; 这个是写死在主程序中&#xff0c;每次增加可以支持的文件类型的时候&#xff0c;都需要去修改主程序中这个FILGE_TYPE的定义。 主程序修改其实不太花时…...

传统建筑管理人力成本高,楼宇自控系统如何有效降低运营成本

在传统建筑管理模式下&#xff0c;人力成本一直居高不下&#xff0c;成为建筑运营方沉重的负担。从设备的日常巡检、维护&#xff0c;到环境的调控以及能源的管理&#xff0c;无一不需要大量人力投入。然而&#xff0c;随着科技的飞速发展&#xff0c;楼宇自控系统应运而生&…...

RabbitMQ demo案例

1. 下载和安装 RabbitMQ RabbitMQ 依赖 Erlang 运行时&#xff0c;所以得先装 Erlang&#xff0c;再装 RabbitMQ。下面以 Ubuntu 为例&#xff0c;Windows 和 macOS 也顺便提一下。 1.1 安装 Erlang RabbitMQ 需要 Erlang 支持&#xff0c;先装它。 Windows&#xff1a; 去 Erl…...

第T8周:猫狗识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 第T8周&#xff1a;猫狗识别 tf.config.list_physical_devices(“GPU”)&#xff0c;用于检测当前系统是否有可用的 GPU&#xff0c;并将结果存入 gpus 变量。…...

旅游特种兵迪士尼大作战:DeepSeek高精准路径优化

DeepSeek大模型高性能核心技术与多模态融合开发 - 商品搜索 - 京东 随着假期的脚步日渐临近&#xff0c;环球影城等备受瞩目的主题游乐场&#xff0c;已然成为大人与孩子们心中不可或缺的节日狂欢圣地。然而&#xff0c;随之而来的庞大客流&#xff0c;却总让无数游客在欢乐的…...

ffmpeg-将多个视频去掉音频 然后切片组合成一个视频,再将新视频配置上新的音频

需求分解 1、去除原视频的音频轨道。 2、对去掉音频的视频进行切片。 3、将多个视频切片合并为一个新视频。 4、给新的视频添加新的音频轨道。 去除视频音频 要去除视频中的音频&#xff0c;只需使用以下命令 ffmpeg -i input1.mp4 -an -c:v copy output1_no_audio.mp4解释&a…...

05-微服务可观测性体系建设:从日志、监控到链路追踪实战指南

微服务可观测性体系建设&#xff1a;从日志、监控到链路追踪实战指南 一、可观测性&#xff1a;微服务架构的 “神经系统” 1.1 为什么需要可观测性&#xff1f; 在分布式微服务架构中&#xff0c;服务节点可能达数百个&#xff0c;请求链路跨越多服务、数据库、消息队列&am…...

音视频小白系统入门笔记-0

本系列笔记为博主学习李超老师课程的课堂笔记&#xff0c;仅供参阅 音视频小白系统入门课 音视频基础ffmpeg原理 绪论 ffmpeg推流 ffplay/vlc拉流 使用rtmp协议 ffmpeg -i <source_path> -f flv rtmp://<rtmp_server_path> 为什么会推流失败&#xff1f; 默认…...

基于 PyTorch 的 LSTM 实现降雨量预测

基于 PyTorch 的 LSTM 实现降雨量预测示例。包括数据准备、模型定义、训练和预测等。 文章目录 1. 数据准备:2. 模型定义:3. 训练过程:4. 预测和评估:5. 可视化:代码实现1. 数据准备: 使用随机生成的数据作为示例,实际应用中请替换为真实数据。数据被归一化到 [0, 1] 范…...

Spring-Bean的生命周期

一、什么是Bean生命周期&#xff1f; Spring容器中的Bean从创建到销毁的完整过程被称为Bean生命周期&#xff0c;包含实例化→属性注入→初始化→使用→销毁五个核心阶段。Spring提供了丰富的扩展点&#xff0c;允许开发者在各阶段插入自定义逻辑。 二、Bean生命周期全流程&am…...

AI大模型如何重塑科研范式:从“假说驱动”到“数据涌现”

📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:科研进入“模型共研”时代 传统科研范式通常以“假设→实验→验证→理论”的方式推进,这一经典路径建立在人类的认知能力与逻辑推理基础上。然而,随着数据规模的爆炸式增长与知识系统的高度复杂…...

yml文件上传并映射到实体类

文章目录 功能背景功能需要前端开发组件选用组件嵌套和参数绑定上传逻辑示例 后端开发接收逻辑解析逻辑省流纯手动实现&#xff08;不建议&#xff09; 功能背景 开发一个配置文件解析功能&#xff0c;需要兼容老版本的配置文件。 功能需要 前端&#xff1a;两个配置文件分别…...

What are the advantages of our neural network inference framework?

What are the advantages of our neural network inference framework? 1. Background2. What are the advantages of our neural network inference framework?References 1. Background Let me introduce /ˌɪntrəˈdjuːs/ the background /ˈbkɡraʊnd/ first. Today…...

猿辅导集团推首个教育AI范式小猿AI 聚焦家校应用场景发布3款新品

近两年&#xff0c;通用大模型呈爆发式发展&#xff0c;垂类AI遭遇“技术平替”危机。 4月15日&#xff0c;猿辅导集团在“小猿AI暨智能硬件战略发布会”上&#xff0c;正式推出首个教育AI范式——“小猿AI”&#xff0c;并发布覆盖家校两端的“软件应用智能终端通识课程”三位…...

10【模块学习】LCD1602(二):6路温度显示+实时时钟

项目&#xff1a;6路温度显示实时时钟 1、6路温度显示①TempMenu.c文件的代码②TempMenu.h文件的代码③main.c文件的代码④Timer.c文件的代码⑤Delay.c文件的代码⑥Key.c文件的代码 2、实时时钟显示①BeiJingTime.c文件的代码②BeiJingTime.h文件的代码③main.c文件的代码如下④…...

Embedding在RAG中的核心作用及其几何类比-来自DeepSeek

1. 核心概念映射 Embedding的本质&#xff1a;将文本、图像等非结构化数据转化为高维空间中的坐标点&#xff08;向量&#xff09;&#xff0c;例如&#xff1a; 句子A → 向量 [0.2, -1.5, 3.0, ..., 0.7]&#xff08;假设维度为768&#xff09; 句子B → 向量 [0.3, -1.4, 2…...

前端快速入门——JavaScript函数、DOM

1.JavaScript函数 函数是一段可重复使用的代码块&#xff0c;它接受输入(参数)、执行特定任务&#xff0c;并返回输出。 <scricpt>function add(a,b){return ab;}let cadd(5,10);console.log(c); </script>2.JavaScript事件 JavaScript绑定事件的方法&#xff1…...

AOSP14 Launcher3——最近任务TaskViewSimulator详解

前言&#xff1a;TaskViewSimulator 这个类在最近任务中起到了一个非常重要的作用。 从字面意思上理解&#xff0c;这个单词是由TaskViewSimulator组合而来&#xff0c;字面意思就是TaskView的模拟器&#xff0c;顾名思义&#xff0c;就是一个用来模拟TaskView的类。 为什么要模…...