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

python的global在编译层面的进阶理解

目录

报错情况

编译执行过程

(1)源代码(.py 文件)

(2)编译阶段:解析 & 生成字节码

(3)解释执行:Python 虚拟机(PVM)

字节码分析

语法树分析

字节码的生成

阶段一:AST 遍历与标记(第一遍扫描)

阶段二:符号分析与作用域解析(第二遍扫描)​编辑

错误分析

第一种

第二种

第三种

总结

特例


有那里不妥,还请多多指教。

报错情况

第一种情况,这样的代码会报错,你理解不?

x = 0def chuli(s):if s is None:global xx = 50else:global xx = 100

第二种情况,这样的代码会报错,你理解不?

x = 0def chuli(s):global xx = 50global xx = 100

第三种情况,这样的代码会报错,你理解不?

x = 0def chuli(s):x = 50global xx = 100

第四种情况,这样的代码正确执行了,而且值是100,你理解不?

x = 0def chuli(s):while False:global xx = 100chuli(None)
print(x)  # 100

反正我一开始遇到 第一种情况 是无语的,我都在喷这语法设计了,甚至怀疑我的python学了个寂寞。而且我在网上搜索了一堆关于global的讲解,但是没人去尝试这样的错误,去解释这样出现的原因,都是在那反反复复的去讲解python的语法文档中写的非常清楚的内容。有时感觉,有点悲哀,我跟大多数人的思路有点不合群,大家都没有一点想法,找不到有点共情的文章了。然后我只能一点点去从编译的角度,看看这个编译器、解释器是怎么实现对这部分代码的语法分析的。

编译执行过程

在分析之前,我们说一说这个python代码从编译到执行的过程。

        当你运行一个 Python 文件(python script.py),Python 解释器会按照以下步骤执行代码:

(1)源代码(.py 文件)

        你编写的 Python 代码是纯文本,存储在 .py 文件中。

(2)编译阶段:解析 & 生成字节码

        Python 不会直接执行源码,而是先将其编译成字节码(Bytecode)

        这个过程包括:

  1. 词法分析(Lexical Analysis):拆分成标记(tokens)

  2. 语法分析(Syntax Analysis):检查代码结构是否合法,生成抽象语法树(AST)

  3. 字节码生成(Bytecode Compilation):转换成 Python 字节码(Bytecode),存储在 .pyc.pyo 文件中(位于 __pycache__ 文件夹)。

(3)解释执行:Python 虚拟机(PVM)

        Python 解释器的核心是 Python 虚拟机(PVM, Python Virtual Machine),它读取字节码并执行相应的操作。

        PVM 是一个虚拟机,它不会将代码编译成 CPU 机器码,而是逐行解释执行 Python 字节码。因此,Python 运行速度相对较慢,但更灵活,支持动态类型。

字节码分析

针对于第一种、第二种、第三张情况,chuli(s)函数都没有被调用运行,然后直接编译运行就会报错SyntaxError: name 'x' is assigned to before global declaration 错误,可以说明这个问题,大概是在编译阶段出现的报错,应该和解释执行阶段没什么关系。

而这里编译阶段最后有个字节码生成,字节码是 Python 解释器能理解的低级指令,与 CPU 指令类似,但独立于具体硬件。我们可以先尝试先从这个字节码角度切入看看global语句的情况。刚好python有个dis库可以查看字节码import dis。

import disx = 0
def chuli1(s):while False:global xx = 100def chuli2(s):global xx = 100def chuli3(s):x = 100print(dis.dis(chuli1))
print(chuli1.__code__.co_consts)  # 查看常量表
print(chuli1.__code__.co_names)   # 查看变量名表
print(chuli1.__code__.co_varnames)  # 查看局部变量
print("-------------------------------------------------")
print(dis.dis(chuli2))
print(chuli2.__code__.co_consts)  # 查看常量表
print(chuli2.__code__.co_names)   # 查看变量名表
print(chuli2.__code__.co_varnames)  # 查看局部变量
print("-------------------------------------------------")
print(dis.dis(chuli3))
print(chuli3.__code__.co_consts)  # 查看常量表
print(chuli3.__code__.co_names)   # 查看变量名表
print(chuli3.__code__.co_varnames)  # 查看局部变量

这里执行三种可以正常运行通过的代码,可以发现,并没有global相关的字节码语句,只有STORE_FAST 和 STORE_GLOBAL的区别(这里如果想深入理解python的字节码,可以补齐一点python字节码的知识dis — Disassembler for Python bytecode — Python 3.13.2 documentation)。而且chuli3(s)函数中的x在函数的局部变量表中,chuli2(s)和chuli1(s)在全局变量表中,可以断定,global语句不会生成对应的字节码语句,而会将变量的位置初始化到函数的全局变量表中。

但是,依照语法,chuli1(s)中的“global x”的while循环根本,不会进去,“global x”应该不会被执行,但是chuli1(s)和chuli2(s)的字节码的效果是一样的。进一步说明,“global x”不是通过生成字节码,在解释执行阶段用虚拟机PVM来执行的。而是在生成字节码前被提前处理或者标记了。

语法树分析

所以,我们继续顺腾摸瓜,查找一下编译阶段具体是如何处理global语句的,来解释第一种、第二种、第三种在编译阶段为什么会报错。python中有个ast库可以获取python代码编译过程的抽象语法树(这里如果想深入理解python的字节码,可以补齐一点python字节码的知识ast — Abstract Syntax Trees — Python 3.13.2 documentation)。

import astcode = """
x = 0
def chuli(s):if s is None:global xx = 50else:global xx = 100
"""try:tree = ast.parse(code)print(ast.dump(tree, indent=4))print("AST 解析成功")
except SyntaxError as e:print("AST 解析失败:", e)

这里我们将前面三种情况会报错的代码的AST解析都是成功的,并且global x对应的语法分析结果"Global(names=['x'])" 仍然保留,并未被处理。

字节码的生成

以此,我们可以确定这个global是在字节码生成阶段被处理的,并且报错的。这个部分由python的CPython的symtable.c文件处理https://github.com/python/cpython/blob/main/Python/symtable.c

这个处理过程主要分为两个阶段:

阶段一:AST 遍历与标记(第一遍扫描)

这个阶段发生在代码访问抽象语法树(AST)节点时。相关的函数是 symtable_visit_stmt,特别是处理 Global_kind 这个global关键字对应的token:

  1. 识别 Global_kind 节点:
    当 symtable_visit_stmt 函数遇到一个语句节点 s,并且 s->kind == Global_kind(表示这是一个 global 语句)时,它会执行该 case 分支内的代码。

  2. 遍历名称:
    代码获取被声明为 global 的标识符序列:asdl_identifier_seq *seq = s->v.Global.names;。然后,它会循环处理这个序列中的每一个 identifier name(标识符名称)。

  3. 冲突检查:
    对于每一个 name,在添加 global 标记之前,它会执行关键的冲突检查

    • long cur = symtable_lookup(st, name);:它查找在当前作用域的符号表(st->st_cur->ste_symbols)中与这个 name 关联的现有标记(flags)。

    • if (cur & (DEF_PARAM | DEF_LOCAL | USE | DEF_ANNOT)):检查这个名字是否已经被标记为:

      • 参数 (DEF_PARAM)

      • 因之前的赋值而成为的局部变量 (DEF_LOCAL)

      • 在 global 声明之前被使用过 (USE)

      • 一个带注解的变量 (DEF_ANNOT)

    • 如果这些标记中有任何一个被设置了,就表示存在冲突,这是一个 SyntaxError(语法错误)。代码会根据冲突的标记确定具体的错误信息(例如 GLOBAL_PARAM - “名字 '...' 是参数又是全局变量”,GLOBAL_AFTER_USE - “名字 '...' 在 global 声明前被使用”,GLOBAL_AFTER_ASSIGN - “名字 '...' 在 global 声明前被赋值”,GLOBAL_ANNOT - “带注解的名字 '...' 不能是全局变量”),并使用正确的位置信息(SET_ERROR_LOCATION)抛出错误。

  4. 添加 DEF_GLOBAL 标记:
    如果没有冲突,代码继续执行:

    • if (!symtable_add_def(st, name, DEF_GLOBAL, LOCATION(s))):调用 symtable_add_def 函数(内部会调用 symtable_add_def_helper)。这个函数将 DEF_GLOBAL 标记添加到当前作用域符号表(st->st_cur->ste_symbols)中与 name 关联的现有标记上。

  5. 记录指令位置:

    • if (!symtable_record_directive(st, name, LOCATION(s))):调用 symtable_record_directive 函数。这个函数存储了这个 name 被声明为 global 的确切源代码位置(行号、列偏移等)。这对于后续分析阶段(如果出现其他冲突,如同时被声明为 global 和 nonlocal)进行准确的错误报告非常重要。

阶段二:符号分析与作用域解析(第二遍扫描)

在第一遍扫描遍历完整个 AST 后,会调用 symtable_analyze 函数,该函数会为每个作用域递归地调用 analyze_block 和 analyze_name。

  1. analyze_block 调用 analyze_name: analyze_block 遍历当前作用域条目(ste)中在第一遍扫描时收集到的符号。对于每个符号(name)及其关联的标记(flags),它会调用 analyze_name。

  2. analyze_name 处理 DEF_GLOBAL:
    在 analyze_name 内部,当它处理一个符号(name),其 flags(从第一遍扫描构建的符号表条目中获取)包含了 DEF_GLOBAL 位时:

    • if (flags & DEF_GLOBAL):这个条件判断为真。

    • Nonlocal 冲突检查: 首先检查 if (flags & DEF_NONLOCAL)。如果一个名字因为某种原因同时被标记为 global(在当前作用域)和 nonlocal(也在当前作用域,尽管 symtable_visit_stmt 应该阻止这种情况,但这是一种保护措施),就会引发一个 SyntaxError(“名字 '...' 是 nonlocal 又是 global”),并使用 symtable_record_directive 存储的位置信息。

    • 设置作用域为 GLOBAL_EXPLICIT: SET_SCOPE(scopes, name, GLOBAL_EXPLICIT);:它明确地将这个名字的作用域设置为 GLOBAL_EXPLICIT(显式全局)。这个设置是发生在一个临时的 scopes 字典中,该字典用于本次分析过程。之后 update_symbols 函数会使用这个字典,将最终的作用域值(与其他标记打包在一起)写回到主符号表条目(ste->ste_symbols)中。

    • 更新 global 集合: if (PySet_Add(global, name) < 0):它将这个名字添加到一个名为 global 的集合中。这个集合追踪在当前作用域或任何外层作用域中已知为全局的所有名字,并在分析嵌套的子作用域时向下传递。

    • 更新 bound 集合: if (bound && (PySet_Discard(bound, name) < 0)):如果这个名字可能存在于 bound 集合(在外层函数作用域中绑定的名字)中,它会被移除,因为显式的 global 声明会覆盖任何外层的绑定。

错误分析

第一种

x = 0def chuli(s):if s is None:global x  # 第一次 global 声明x = 50   # 对 x 进行赋值(使用)else:global x  # 第二次 global 声明 <--- 问题所在x = 100

核心原因:

Python 的 global 语句作用于其所在的整个函数作用域,而不是仅仅作用于它出现的那个代码块(如 if 或 else 块)。一旦你在函数中的某个地方声明了一个名字是 global 的,这个声明对整个函数都有效。

关键在于,在一个名字(如 x)在函数作用域内被使用(赋值或读取)之后,你不能再次对同一个名字使用 global 声明。

编译器(symtable.c)处理流程及报错点:

  1. 模块级别: x = 0 被处理。在模块作用域的符号表中,x 被标记为DEF_LOCAL,只是符号表构建第一阶段记录“绑定发生在此作用域”的一种方式。在第二阶段的作用域解析中,它被正确识别为 GLOBAL_IMPLICIT。最终在字节码生成阶段,结合作用域类型(模块)和作用域属性(GLOBAL_IMPLICIT),编译器会生成操作全局命名空间的 LOAD_NAME/STORE_NAME 指令,而不是像函数局部变量那样生成 LOAD_FAST/STORE_FAST。

  2. 进入函数 chuli: 编译器为函数 chuli 创建一个新的符号表作用域。

  3. 处理 if s is None: 块:

    • global x (第一次):

      • 编译器(symtable_visit_stmt)遇到第一个 global x。

      • 它检查在 chuli 函数作用域内,x 是否已经被用作参数、局部变量、或者已经被使用或注解。此时还没有,检查通过。

      • 编译器在 chuli 的符号表中为 x 添加 DEF_GLOBAL 标记,表示它在这个函数里是全局变量。并记录下这个 global 语句的位置。

    • x = 50:

      • 编译器遇到对 x 的赋值语句。

      • 它查找 x。由于上一步的 global 声明,它知道 x 指的是全局变量。

      • 同时,因为发生了赋值,编译器也会在 chuli 的符号表中为 x 添加 DEF_LOCAL 标记(表示在本作用域内有绑定操作)或者 USE 标记(表示被使用了)。现在 x 的标记类似于 DEF_GLOBAL | DEF_LOCAL 或 DEF_GLOBAL | USE。

  4. 处理 else: 块:

    • global x (第二次):

      • 编译器(symtable_visit_stmt)遇到第二个 global x。

      • 它再次查找 x 在 chuli 作用域内的标记 cur。此时 cur 的值包含了 DEF_GLOBAL 以及因为 x = 50 而添加的 DEF_LOCAL 或 USE 标记。

      • 编译器执行冲突检查:if (cur & (DEF_PARAM | DEF_LOCAL | USE | DEF_ANNOT))。

      • 因为 cur 中包含了 DEF_LOCAL 或 USE 标记,这个 if 条件判断为

      • 代码根据检测到的冲突标记(DEF_LOCAL 或 USE)确定错误消息。由于 DEF_LOCAL (表示赋值) 存在,错误消息是 GLOBAL_AFTER_ASSIGN("名字 'x' 在 global 声明前被赋值")。

      • 编译器使用 PyErr_Format 设置 SyntaxError,并附带错误消息和第二个 global x 语句的位置。

      • symtable_visit_stmt 返回失败 (0),整个编译过程(符号表构建阶段)中止。

第二种

x = 0def chuli(s):global x  # 第一次 global 声明x = 50   # 对 x 进行赋值 (构成一种“使用”)global x  # 第二次 global 声明 <--- 问题所在x = 100

核心原因:

Python 规定,在一个函数作用域内,对于一个特定的名字(比如这里的 x),global 声明必须出现在该名字在该函数中首次被使用(赋值或读取)之前

一旦你在函数中对 x 进行了赋值(x = 50),编译器就认为 x 已经被“使用”了。在此之后,你不能再次为同一个名字 x 使用 global 声明。

编译器(symtable.c)处理流程及报错点:

  1. 模块级别: x = 0 被处理。在模块作用域符号表中,x 被正确地识别(最终解析为 GLOBAL_IMPLICIT 类型,并准备使用 LOAD_NAME/STORE_NAME)。

  2. 进入函数 chuli: 编译器为函数 chuli 创建一个新的符号表作用域。

  3. 处理第一个 global x:

    • 编译器(symtable_visit_stmt)遇到第一个 global x。

    • 检查在 chuli 函数作用域内,x 是否已被用作参数、局部变量、或者已被使用或注解。此时还没有,检查通过。

    • 编译器在 chuli 的符号表中为 x 添加 DEF_GLOBAL 标记,表示它在这个函数里引用的是全局变量。

  4. 处理 x = 50:

    • 编译器遇到对 x 的赋值语句。

    • 它查找 x。由于上一步的 global 声明,它知道 x 指的是全局变量。

    • 关键点: 因为这里发生了赋值操作,这在符号表分析中被视为对该名字的一种“使用”或“绑定”。编译器会在 chuli 的符号表中为 x 添加相应的标记,比如 DEF_LOCAL(表示在此作用域有绑定发生)或者 USE 标记。现在 x 的标记包含了 DEF_GLOBAL 以及 DEF_LOCAL 或 USE。

  5. 处理第二个 global x:

    • 编译器(symtable_visit_stmt)遇到第二个 global x。

    • 它再次查找 x 在 chuli 作用域内的标记 cur。此时 cur 的值包含了 DEF_GLOBAL 以及因为 x = 50 而添加的 DEF_LOCAL 或 USE 标记。

    • 编译器执行冲突检查:if (cur & (DEF_PARAM | DEF_LOCAL | USE | DEF_ANNOT))。

    • 由于 cur 中包含了 DEF_LOCAL 或 USE 标记,这个 if 条件判断为

    • 编译器检测到冲突:一个 global 声明出现在名字 x 被赋值(DEF_LOCAL 标记被设置)或使用(USE 标记被设置)之后

    • 根据冲突的标记(主要是 DEF_LOCAL),编译器确定错误消息为 GLOBAL_AFTER_ASSIGN ("name 'x' is assigned to before global declaration" - “名字 'x' 在 global 声明前被赋值”)。

    • 编译器使用 PyErr_Format 设置 SyntaxError,附带错误消息和第二个 global x 语句的位置。

    • 符号表构建阶段失败,编译中止。

第三种

x = 0 # 全局变量 xdef chuli(s):x = 50   # <--- 关键点:这里先对 x 进行了赋值global x  # <--- 然后尝试声明 x 为全局变量x = 100

核心原因:

Python 在处理函数内的变量时,遵循以下规则:

  1. 默认局部变量: 如果在函数内部对一个变量进行赋值,并且之前没有对该变量使用 global 或 nonlocal 声明,那么 Python 会默认将该变量视为这个函数的局部变量,覆盖任何同名的外部变量。

  2. global 声明时机: global 声明必须出现在该变量在函数作用域内首次被使用(包括赋值)之前

编译器(symtable.c)处理流程及报错点:

  1. 模块级别: x = 0 被处理,x 被识别为模块(全局)变量。

  2. 进入函数 chuli: 编译器为函数 chuli 创建一个新的符号表作用域。

  3. 处理 x = 50:

    • 编译器遇到对 x 的赋值语句。

    • 它检查在 chuli 函数作用域内,之前是否有 global x 或 nonlocal x 的声明。答案是没有

    • 根据规则 1,编译器立即决定 x 在 chuli 函数内部是一个局部变量

    • 它在 chuli 的符号表中添加 x,并标记为 DEF_LOCAL(表示在这个作用域内发生了绑定,并且是局部的)。

  4. 处理 global x:

    • 编译器遇到 global x 语句。

    • 它查找 x 在 chuli 作用域内的标记 cur。此时 cur 的值是 DEF_LOCAL(因为之前的 x = 50)。

    • 编译器执行冲突检查:if (cur & (DEF_PARAM | DEF_LOCAL | USE | DEF_ANNOT))。

    • 因为 cur 中包含了 DEF_LOCAL 标记,这个 if 条件判断为

    • 冲突发生! 编译器检测到:在一个名字 (x) 已经被当作局部变量进行赋值(DEF_LOCAL 标记已设置)之后,又尝试用 global 来声明它。这在逻辑上是矛盾的。

    • 编译器根据检测到的冲突标记(DEF_LOCAL),确定错误消息为 GLOBAL_AFTER_ASSIGN ("name 'x' is assigned to before global declaration" - “名字 'x' 在 global 声明前被赋值”)。

    • 编译器使用 PyErr_Format 设置 SyntaxError,附带错误消息和 global x 语句的位置。

    • 符号表构建阶段失败,编译中止。

总结

python中的这种 global 声明,它不会被编译成字节码执行,是在通过 语法树 去 生成字节码 时,被处理的存在。

python中的这种 global 声明是函数级别的,它可以在函数的任何地方被声明而生效,并不会因为它出现在不会被执行的代码中,它就不会生效。

global多少次一个变量都没问题,只要不要出现前面的代码中使用了这个变量,或对这个变量采用了赋值操作后导致被标记为全局作用域就可以了。

我都觉得这设计有点恶心、特别了,居然找了那么久都没人注意这个。

如果函数需要修改全局作用域中的不可变变量,就需要 global 关键字。可变变量呢?看下面的特例。

特例

还有一个比较让人有点无语的设计,这里可以不用global去改变全局变量。

x = []
def chuli1():x = [100]
chuli1()
print(x)  # []x = []
def chuli2():x.append(100)
chuli2()
print(x)  # [100]

相关文章:

python的global在编译层面的进阶理解

目录 报错情况 编译执行过程 &#xff08;1&#xff09;源代码&#xff08;.py 文件&#xff09; &#xff08;2&#xff09;编译阶段&#xff1a;解析 & 生成字节码 &#xff08;3&#xff09;解释执行&#xff1a;Python 虚拟机&#xff08;PVM&#xff09; 字节码…...

OpenCV、YOLO与大模型的区别与关系

OpenCV、YOLO 和大模型的区别与关系 1. OpenCV&#xff08;Open Source Computer Vision Library&#xff09; 定位&#xff1a;开源的计算机视觉基础库。功能&#xff1a;提供传统的图像处理算法&#xff08;如图像滤波、边缘检测、特征提取&#xff09;和基础工具&#xff…...

Buzz1.2.0视频语音转成TXT、SRT、VTT工具

buzz0.9.0.exe下载 https://download.csdn.net/download/u011000529/90551347 特征 导入音频和视频文件并导出文本到 TXT、SRT 和 VTT从您计算机的麦克风转录和翻译成文本&#xff08;资源密集型且可能不是实时的&#xff0c;Demo&#xff09;支持Whisper、 Whisper.cpp、Fast…...

Vue 2 和 Vue 3 中的钩子函数

Vue 钩子函数也被叫做生命周期钩子函数&#xff0c;它是 Vue 实例在其生命周期的不同阶段自动调用的函数。可以利用这些钩子函数在特定阶段执行自定义代码。 Vue 2 生命周期钩子函数 在 Vue 2 里&#xff0c;生命周期钩子函数可以在组件选项对象中定义。下面是一个简单的 Vue…...

零基础如何学会Appium自动化测试?

前言 appium是一款移动自动化测试工具&#xff0c;经常被用于实现UI自动化测试&#xff0c;其可支持安卓和IOS两大平台&#xff0c;还支持多种编程&#xff0c;因而得到了广泛的应用。此处便是立足于安卓平台&#xff0c;借助appium工具&#xff0c;使用python语言实现简单的自…...

用Python实现TCP代理

依旧是Python黑帽子这本书 先附上代码&#xff0c;我在原书代码上加了注释&#xff0c;更好理解 import sys import socket import threading#生成可打印字符映射 HEX_FILTER.join([(len(repr(chr(i)))3) and chr(i) or . for i in range(256)])#接收bytes或string类型的输入…...

SQL复杂查询与性能优化:医药行业ERP系统实战指南

SQL复杂查询与性能优化&#xff1a;医药行业ERP系统实战指南 一、医药行业数据库特性分析 在医药ERP系统中&#xff0c;数据库通常包含以下核心表结构&#xff1a; -- 药品主数据 CREATE TABLE drug_master (drug_id INT PRIMARY KEY,drug_name VARCHAR(255),specification …...

问题大集10-git使用commit提交中文显示乱码

&#xff08;1&#xff09;问题 &#xff08;2&#xff09;解决步骤 1&#xff09; 设置全局编码为 UTF-8 git config --global core.quotepath false git config --global i18n.commitEncoding utf-8 git config --global i18n.logOutputEncoding utf-8 2&#xff09; 显示或设…...

vue前端项目技术架构(第二版)

vue技术架构介绍 如下图所示&#xff0c;展示了项目系统的软件层次架构。该系统采用基于SOA&#xff08;面向服务架构&#xff09;思想的分层架构&#xff0c;分为四个主要层次&#xff1a;视图层、编译层、代码层和数据层。 视图层 浏览器&#xff1a;核心职责是解析并展示…...

Java 开发中的 AI 黑科技:如何用 AI 工具自动生成 Spring Boot 项目脚手架?

在 Java 开发领域&#xff0c;搭建 Spring Boot 项目脚手架是一项耗时且繁琐的工作。传统方式下&#xff0c;开发者需要手动配置各种依赖、编写基础代码&#xff0c;过程中稍有疏忽就可能导致配置错误&#xff0c;影响开发进度。如今&#xff0c;随着 AI 技术的迅猛发展&#x…...

计算机网络知识点汇总与复习——(一)计算机网络体系结构

Preface 计算机网络是考研408基础综合中的一门课程&#xff0c;它的重要性不言而喻。然而&#xff0c;计算机网络的知识体系庞大且复杂&#xff0c;各类概念、协议和技术相互关联&#xff0c;让人在学习时容易迷失方向。在进行复习时&#xff0c;面对庞杂的的知识点&#xff0c…...

Copilot完全指南:AI编程助手的革命性实践

一、智能编程新时代&#xff1a;从代码补全到AI结对编程 1.1 Copilot的进化历程 2021年GitHub Copilot的诞生标志着编程辅助工具进入新纪元。与传统IDE补全工具相比&#xff0c;Copilot展现出三大革命性特征&#xff1a; 语义理解&#xff1a;基于GPT模型理解代码上下文跨文…...

Redis 梳理汇总目录

Redis 哨兵集群&#xff08;Sentinel&#xff09;与 Cluster 集群对比-CSDN博客 如何快速将大规模数据保存到Redis集群-CSDN博客 Redis的一些高级指令-CSDN博客 Redis 篇-CSDN博客...

5、无线通信基站的FPGA实现架构

基站&#xff08;Base Station&#xff0c;BS&#xff09;&#xff0c;也称为公用移动通信基站&#xff0c;是无线电台站的一种形式&#xff0c;具体则指在一定的无线电覆盖区中&#xff0c;通过移动通信交换中心&#xff0c;与移动电话终端之间的信息传递的无线电收发信电台。…...

MySQL - 索引原理与优化:深入解析B+Tree与高效查询策略

文章目录 引言一、BTree索引核心原理1.1 索引数据结构演化1.2 BTree的存储结构通过主键查询&#xff08;主键索引&#xff09;商品数据的过程通过非主键&#xff08;辅助索引&#xff09;查询商品数据的过程 MySQL InnoDB 的索引原理 二、执行计划深度解析三、索引失效的六大陷…...

2025年数智化电商产业带发展研究报告260+份汇总解读|附PDF下载

原文链接&#xff1a;https://tecdat.cn/?p41286 在数字技术与实体经济深度融合的当下&#xff0c;数智化产业带正成为经济发展的关键引擎。 从云南鲜花产业带的直播热销到深圳3C数码的智能转型&#xff0c;数智化正重塑产业格局。2023年数字经济规模突破53.9万亿元&#xff…...

html实现手势密码

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>手势密码</title><style>body {font-fam…...

机器学习(八):K-Means聚类原理与实战

声明&#xff1a;未经允许禁止转载与抄袭。 前言 k k k均值&#xff08; k k k-means&#xff09;聚类算法是一种经典的无监督聚类算法&#xff0c;本文将深入解析其理论原理&#xff0c;并在真是数据集上进行算法实践&#xff0c;话不多说&#xff0c;请看下文。 算法原理 …...

从 Word 到 HTML:使用 Aspose.Words 轻松实现 Word 文档的高保真转换

从 Word 到 HTML&#xff1a;使用 Aspose.Words 轻松实现 Word 文档的高保真转换 前言一、环境准备二、核心代码实现1. 将 Word 转换为 HTML 文件流2. 优化超链接样式 三、测试效果四、总结 前言 在日常开发中&#xff0c;我们经常需要将 Word 文档转换为 HTML&#xff0c;用于…...

SQLMesh调度系统深度解析:内置调度与Airflow集成实践

本文系统解析SQLMesh的两种核心调度方案&#xff1a;内置调度器与Apache Airflow集成。通过对比两者的适用场景、架构设计和操作流程&#xff0c;为企业构建可靠的数据分析流水线提供技术参考。重点内容包括&#xff1a; 内置调度器的轻量级部署与性能优化策略Airflow集成的端到…...

【深度学习新浪潮】Grok过去两周的进展一览(2025.04.01)

1. Grok过去两周的进展一览 根据公开信息,Grok在过去两周的主要进展如下: Grok 3正式上线并开放 xAI于2025年3月30日宣布Grok 3正式向所有Premium+订阅用户开放,并同步将X平台的Premium+订阅费用上涨至月费近50美元、年费350美元。这是继Grok 2之后的重大升级,其推理能力和…...

Vue表单数据回显失败技术解析与修复指南!!!

Vue表单数据回显失败技术解析与修复指南 &#x1f680; 在Vue.js应用开发中&#xff0c;「父子组件通信」「动态弹窗」是经典功能组合。但当遇到关键场景表单数据无法回显时&#xff0c;你是否也在深夜加班改bug&#xff1f;本文通过完整案例分析&#xff0c;揭秘该问题背后深层…...

【Office办公】【Excel】VLOOKUP函数-高速查找指定匹配数据,可合并2个表格

VLOOKUP 是 Excel 中常用的查找函数&#xff0c;用于在表格或区域中按列查找特定值并返回对应行的其他列数据。以下是详细使用方法及注意事项&#xff1a; 函数语法 VLOOKUP(查找值, 表格范围, 列索引号, [匹配方式])查找值&#xff1a;要查找的值&#xff08;如单元格引用或…...

Java基础-21-基本语法-封装

封装&#xff08;Encapsulation&#xff09; 1. 什么是封装&#xff1f; 封装&#xff08;Encapsulation&#xff09;是面向对象编程&#xff08;OOP&#xff09;中的一个重要特性。它指的是将对象的属性和行为封装在一个类中&#xff0c;并提供访问控制机制&#xff0c;防止…...

SpringCloud概述

Spring Cloud Alibaba 1 系统架构演进 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为现在流行的微服务架构。 1.1 单体架构 早期的软件系统通常是基于单体应用架构设计的&#xff0c;也就是将整个系统作为一个单一的…...

Kafka中的消息是如何存储的?

大家好&#xff0c;我是锋哥。今天分享关于【Kafka中的消息是如何存储的&#xff1f;】面试题。希望对大家有帮助&#xff1b; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Kafka 中&#xff0c;消息是通过 日志&#xff08;Log&#xff09; 的方式进行存储的。…...

主流Web3公链的核心区别对比

以下是当前主流Web3公链的核心区别对比表&#xff0c;涵盖技术架构、性能、生态等关键维度&#xff1a; 特性以太坊 (Ethereum)SolanaBNB ChainPolygonAvalanche共识机制PoS&#xff08;信标链分片&#xff09;PoH&#xff08;历史证明&#xff09; PoSPoSA&#xff08;权益证…...

美甲预约管理系统基于Spring Boot SSM

目录 摘要 1. 引言‌ 1.1 研究背景与意义 1.2 国内外研究现状 ‌2. 系统需求分析‌ 2.1 功能需求 2.2 非功能需求 ‌3. 系统设计与实现‌ 3.1 系统架构设计 3.2 关键技术实现 3.3 系统模块实现 ‌3.3.1店铺管理‌ ‌3.3.2商品管理‌ ‌3.3.3用户管理‌ ‌3.3.4订…...

Doris Streamloader安装教程

官方连接&#xff1a;Doris Streamloader - Apache Doris 简单概述&#xff1a;Doris Streamloader 是一款用于将数据导入 Doris 数据库的专用客户端工具。 step1&#xff1a;安装go环境 [rootlocalhost ~]# rpm --import https://mirror.go-repo.io/centos/RPM-GPG-KEY-GO-…...

用Python做数据分析之数据统计

接下来说说数据统计部分&#xff0c;这里主要介绍数据采样&#xff0c;标准差&#xff0c;协方差和相关系数的使用方法。 1、数据采样 Excel的数据分析功能中提供了数据抽样的功能&#xff0c;如下图所示。Python 通过 sample 函数完成数据采样。 2、数据抽样 Sample是进行…...

H.264编码解析与C++实现详解

一、H.264编码核心概念 1.1 分层编码结构 H.264采用分层设计&#xff0c;包含视频编码层&#xff08;VCL&#xff09;和网络抽象层&#xff08;NAL&#xff09;。VCL处理核心编码任务&#xff0c;NAL负责封装网络传输数据。 1.2 NALU单元结构 // NAL单元头部结构示例 struc…...

OpenAI即将开源!DeepSeek“逼宫”下,AI争夺战将走向何方?

OpenAI 终于要 Open 了。 北京时间 4 月 1 日凌晨&#xff0c;OpenAI 正式宣布&#xff1a;将在未来几个月内开源一款具备推理能力的语言模型&#xff0c;并开放训练权重参数。这是自 2019 年 GPT-2 部分开源以来&#xff0c;OpenAI 首次向公众开放核心模型技术。 【图片来源于…...

音视频 四 看书的笔记 MediaPlayerService

Binder机制看这里 Binde机智 这是一个分割符 Binder机智 分割(goutou) Binder机制 MediaPlayerService多媒体框架中一个非常重要的服务。MediaPlayerService 我原称之为链接之王 图片来源 MediaPlayer 是客户端 C/S 中的CMediaPlayerService MediaPlayerService::Client 是服…...

android Fragment使用

在 Android Fragment 中&#xff0c;导入 id&#xff08;findViewById&#xff09;并给控件赋值的逻辑通常应该写在 onViewCreated() 方法中&#xff0c;而不是 onCreateView()。 Fragment 生命周期 & 适合的位置 方法作用适合的操作onCreateView()创建并返回 Fragment 的…...

LayaAir3.3.0-beta.3重磅更新!Spine4.2、2D物理、UI系统、TileMap等全面升级!

正式版推出前&#xff0c;说明3.3的功能还没开发完。所以&#xff0c;又一大波更新来了~ 下面对重点更新进行说明。 Spine的重要更新 3.3.0-beta.3版本开始&#xff0c;新增了Spine 4.2 的运行时库&#xff0c;Spine动画上可以支持物理特性了。例如&#xff0c;下图右侧女孩在启…...

deepseek v3-0324 化学键线式Canvas编辑器设计

化学键线式Canvas编辑器设计 下面是一个基于HTML5 Canvas的化学键线式编辑器的基本实现方案。这个编辑器允许用户绘制有机化学中常见的键线式结构。 基本HTML结构 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"…...

解决 CMS Old GC 频繁触发线上问题技术方案

目录 一、CMS GC 工作原理 二、现象分析 &#xff08;一&#xff09;具体表现说明 &#xff08;二&#xff09;触发条件 三、总结优化措施 &#xff08;一&#xff09;调整 CMS 启动条件&#xff1a;降低 Old 区触发阈值 1. 原理分析 2. 建议配置 &#xff08;二&…...

后端实现加解密工具类(记录)

后端利用3DES加解密工具类实现特殊字段加解密&#xff0c;比如个人信息、请求参数等 &#xff0c;可以自定义密钥和IV加密&#xff0c;代码如下&#xff0c;直接使用即可。 import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory…...

云原生技术赋能企业数字化转型:实战案例与架构演进

引言&#xff1a;数字化转型的云原生机遇 在VUCA时代背景下&#xff0c;某金融科技企业面临系统扩展性差、运维成本高企的困境。通过采用云原生技术栈&#xff0c;6个月内实现资源利用率提升300%&#xff0c;故障恢复时间从小时级缩短至分钟级。本文将深度解析该企业技术演进路…...

驱动开发系列49 - 搭建 Vulkan 驱动调试环境(编译 mesa 3D)- Ubuntu24.04

一:搭建Vulkan运行环境 安装vulkan依赖包: 1. sudo apt install vulkan-tools 2. sudo apt install libvulkan-dev 3. sudo apt install vulkan-utility-libraries-dev spirv-tools 4. sudo apt install libglfw3-dev libglm-dev 5. sudo apt install libxxf86vm-dev libxi-…...

自然语言处理(26:(终章Attention 2.)带Attention的seq2seq的实现)

系列文章目录 终章 1&#xff1a;Attention的结构 终章 2&#xff1a;带Attention的seq2seq的实现 终章 3&#xff1a;Attention的评价 终章 4&#xff1a;关于Attention的其他话题 终章 5&#xff1a;Attention的应用 目录 系列文章目录 前言 一、编码器的实现 二、解…...

Qt5.14.2+mingw64编译OpenCV3.4.14一次成功记录

上一文中编译opencv4.5成功了&#xff0c;但是使用过程中没有成功&#xff0c;网上很多的代码没法跑起来&#xff0c;所以才有了此文来编译一个低版本的opencv3的过程记录&#xff0c;全程截图。 一、软件安装 1.1 Python3.8版本安装路径:C:\Users\Administrator\AppData\Loca…...

【数据库原理】基础篇:MySQL基础入门与实战指南

前言 在当今数字化时代&#xff0c;数据已成为企业运营的核心资产之一。而MySQL作为一款广泛使用的开源关系型数据库管理系统&#xff0c;凭借其高性能、可靠性和易用性&#xff0c;成为众多开发者和企业的首选。本文将从MySQL的基础概念出发&#xff0c;逐步深入到实际操作&a…...

使用Python解析PPT文件并生成JSON结构详解

引言 PowerPoint&#xff08;PPT&#xff09;文件的自动化处理是办公自动化和数据提取的常见需求。本文将介绍如何通过Python的python-pptx库&#xff0c;将PPT文件的样式、结构、文本内容等信息解析为标准化的JSON格式&#xff0c;为后续的自动化处理、数据迁移或样式复用提供…...

C#:第一性原理拆解属性(property)

目录 第一步&#xff1a;从最基本的需求出发 第二步&#xff1a;引入控制需求 第三步&#xff1a;优化访问方式 第四步&#xff1a;剖析属性的本质 第五步&#xff1a;进一步简化和演化 自动属性的定义和作用 自动属性的特点和限制 第六步&#xff1a;总结属性的第一性…...

nacos 2.x使用java语言实现自定义Loadbalance

一、核心实现思路 Nacos 2.x 的负载均衡自定义支持两种模式&#xff1a; 基于 Ribbon 的兼容方案&#xff08;适用于 Spring Cloud 2020 之前版本&#xff09;基于 Spring Cloud LoadBalancer 的方案&#xff08;推荐&#xff0c;适配最新 Spring Cloud 2023 和 Nacos 2.x&am…...

torch.nn.Conv2d介绍——Pytorch中的二维卷积层

torch.nn.Conv2d是torch.nn模块中的二维卷积层类&#xff0c;用于构建神经网络中的二维卷积层。 1、基本语法 torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride1, padding0, dilation1, groups1, biasTrue, padding_modezeros, deviceNone, dtypeNone)将 2D …...

ubuntu虚拟机裁剪img文件系统

1. 定制文件系统前期准备 将rootfs.img文件准备好&#xff0c;并创建target文件夹2. 挂载文件系统 sudo mount rootfs.img target #挂载文件系统 sudo chroot target #进入chroot环境3. 内裁剪文件系统 增删裁剪文件系统 exit #退出chroot环境 sudo umount target…...

一文详细讲解Python(详细版一篇学会Python基础和网络安全)

引言 在当今数字化时代&#xff0c;Python 作为一种简洁高效且功能强大的编程语言&#xff0c;广泛应用于各个领域&#xff0c;从数据科学、人工智能到网络安全等&#xff0c;都能看到 Python 的身影。而网络安全作为保障信息系统和数据安全的关键领域&#xff0c;其重要性不言…...

使用QT调试LidarView

前段时间使用VeloView想进行点云的显示&#xff0c;后来发现VeloView的尺子测距不好用&#xff0c;也没有筛选点的功能&#xff0c;就放弃了。kitware同家的还有LidarView&#xff0c;功能多一些&#xff0c;更新的时间更晚&#xff0c;而且还兼容速腾、禾赛等多家点云设备可以…...