局部变量和全局变量(Python)

引入例子拆解

源码

class A:
    def __init__(self):
        self.test = 0

def add(c, k):
    c.test = c.test + 1
    k = k + 1

def main():
    Count = A()
    k = 0
    
    for i in range(0, 25):
        add(Count, k)
    
    print("Count.test=", Count.test)
    print("k=", k)

main()

运行结果如下图

代码解析

这段代码定义了一个类A和一个函数add,然后在main函数中创建了类A的一个实例,并使用了一个局部变量k

1.类定义:

class A:
    def __init__(self):
        self.test = 0

这里定义了一个名为A的类,它有一个特殊的方法__init__,这是一个构造函数,当创建类A的新实例时会被自动调用。在这个方法中,初始化实例变量self.test并将其设置为0。

2.函数定义:

def add(c, k):
    c.test = c.test + 1
    k = k + 1

这里定义了一个名为add的函数,它接受两个参数ck。函数内部,它将参数ctest属性增加1,并将参数k的值增加1。

3.主函数:

def main():
    Count = A()
    k = 0
    
    for i in range(0, 25):
        add(Count, k)
    
    print("Count.test=", Count.test)
    print("k=", k)

main函数是程序的入口点。首先,它创建了类A的一个实例,并将其赋值给变量Count。然后,它初始化一个局部变量k并将其设置为0。

接下来,main函数使用一个for循环,循环25次,每次调用add函数,并将Count实例和k变量作为参数传递。

在循环结束后,main函数打印出Count.testk的值。

4.调用主函数:

main()

最后,调用main函数来执行程序。

输出结果:

  • Count.test的值将会是25,因为在每次调用add函数时,Count实例的test属性都会增加1。
  • k的值将会是0,因为在add函数中对k的修改并不会影响main函数中的k变量。在add函数中,k被重新绑定为一个新的局部变量,它只是临时地覆盖了传入的k值,但这个修改只在add函数的局部作用域内有效。一旦add函数执行结束,这个局部变量k就会被销毁,而main函数中的k变量保持不变。

因此,最终的输出为:

Count.test= 25
k= 0

 Python3命名空间和作用域

命名空间

命名空间(Namespace)是从名称到对象的映射,大部分的命名空间都是通过 Python 字典来实现的。每个命名空间都有一个与之关联的作用域。

命名空间提供了在项目中避免名字冲突的一种方法。各个命名空间是独立的,没有任何关系的,所以一个命名空间中不能有重名,但不同的命名空间是可以重名而没有任何影响。

如下一个计算机系统中的例子,一个文件夹(目录)中可以包含多个文件夹,每个文件夹中不能有相同的文件名,但不同文件夹中的文件可以重名。

一般有三种命名空间: 

  • 内置名称(built-in names), Python 语言内置的名称,比如函数名 abs、char 和异常名称 BaseException、Exception 等等。
  • 全局名称(global names),模块中定义的名称,记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。包含模块中的所有全局变量和函数。
  • 局部名称(local names),函数中定义的名称,记录了函数的变量,包括函数的参数和局部定义的变量。(类中定义的也是),只在这个函数或类中有效。

命名空间查找顺序

假设我们要使用变量 runoob,则 Python 的查找顺序为:局部的命名空间 -> 全局命名空间 -> 内置命名空间。

如果找不到变量 runoob,它将放弃查找并引发一个 NameError 异常:

NameError: name 'runoob' is not defined。

命名空间的生命周期

命名空间的生命周期取决于对象的作用域,如果对象执行完成,则该命名空间的生命周期就结束。

因此,我们无法从外部命名空间访问内部命名空间的对象。

# var1 是全局名称
var1 = 3
def some_func(): 
  
    # var2 是局部名称
    var2 = 6
    def some_inner_func(): 
  
        # var3 是内嵌的局部名称
        var3 = 8

相同的对象名称可以存在于多个命名空间中,如下图。

作用域

作用域就是一个 Python 程序可以直接访问命名空间的正文区域,即变量可以被访问的区域

在一个 python 程序中,直接访问一个变量,会从内到外依次访问所有的作用域直到找到,否则会报未定义的错误。

Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。

变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。Python 的作用域一共有4种,分别是:

有四种作用域:

  • L(Local)最内层,包含局部变量,比如一个函数/方法内部。这是最内层的作用域,通常指的是函数内部的作用域。在这个作用域内声明的变量,只能在该函数内部被访问和修改
  • E(Enclosing):包含了非局部(non-local)也非全局(non-global)的变量。比如两个嵌套函数,一个函数(或类) A 里面又包含了一个函数 B ,那么对于 B 中的名称来说 A 中的作用域就为 nonlocal。当函数定义在另一个函数内部时,内部函数可以访问外部函数的局部变量,即允许嵌套函数访问外层函数的局部变量。这里的外部函数的作用域就被称为封闭作用域。封闭作用域中的变量可以被内部函数访问,但内部函数不能直接修改外部函数的局部变量,除非使用nonlocal声明。
  • G(Global)当前脚本的最外层,比如当前模块的全局变量。这是模块级别的命名空间,包含了模块中定义的所有全局变量和函数。全局变量可以在模块内的任何位置被访问和修改,除非它们被局部作用域中的同名变量遮蔽
  • B(Built-in): 包含了内建的变量/关键字等,最后被搜索。这是最外层的作用域,包含了Python解释器提供的内置函数和变量,如len()print()TrueFalse等,可以被任何模块访问。

规则顺序: L –> E –> G –> B

在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内置中找。

如果在查找过程中找到了变量,就不会再继续向上查找。如果在当前作用域中找到了同名的变量,那么这个变量会遮蔽外层作用域中的同名变量。例如,如果在局部作用域中声明了一个变量,那么它就会遮蔽全局作用域中的同名变量。

g_count = 3  # 全局作用域
def outer():
    o_count = 4  # 闭包函数外的函数中
    def inner():
        i_count = 5  # 局部作用域

内置作用域是通过一个名为 builtin 的标准模块来实现的,但是这个变量名自身并没有放入内置作用域内,所以必须导入这个文件才能够使用它。在Python3.0中,可以使用以下的代码来查看到底预定义了哪些变量:

import builtins
dir(builtins)

Python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如 if/elif/else/、try/except、for/while等)是不会引入新的作用域的,也就是说这些语句内定义的变量,外部也可以访问,如下代码:

实例中name变量定义在if语句块中,但外部还是可以访问的。

如果将name定义在函数中,则它就是局部变量,外部无法访问:

从报错的信息上看,说明了 name_inner 未定义,无法使用,因为它是局部变量,只有在函数内可以使用。

在 Python 中,return 语句用于从函数中返回一个值。当函数调用一个 return 语句时,函数的执行将停止,并将一个值返回给函数调用者。在函数中使用 return 语句可以返回任何类型的数据,包括数字,字符串,列表,元组和字典等。

使用 return 语句时,我们可以选择是否返回值。如果函数没有 return 语句,函数将返回 None 值。None 表示空值,意味着它没有值,与 0,'' 或空列表不同。

全局变量和局部变量

定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。

局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。

让我们通过几个关键点来清晰明了地理解局部变量和全局变量的区别

定义位置

  • 局部变量:在函数内部定义的变量。
  • 全局变量:在所有函数外部定义的变量,通常是在模块级别。

作用域

  • 局部变量:仅在定义它们的函数内部可见。
  • 全局变量:在整个程序中可见,包括所有函数内部。

生命周期

  • 局部变量:当函数被调用时创建,当函数执行结束时销毁。
  • 全局变量:程序运行期间一直存在,直到程序结束。

修改规则

  • 局部变量:在函数内部对局部变量的修改只影响该函数内部的变量。
  • 全局变量:在函数内部对全局变量的修改会影响全局变量的值,但需要使用global关键字来声明。

 如下实例:

x = 10  # 全局变量

def my_function():
    print("Inside function, x =", x)  # 访问全局变量x
    y = 20  # 局部变量
    print("Inside function, y =", y)

my_function()
print("Outside function, x =", x)  # 访问全局变量x
# print("Outside function, y =", y)  # 这将引发错误,因为y是局部变量

在这个例子中,x是全局变量,可以在函数内部和外部访问。而y是局部变量,只能在my_function函数内部访问。

如果我们尝试在函数外部访问y,将会引发一个NameError,因为y的作用域仅限于my_function函数内部。

global 和 nonlocal关键字

当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键词了。

例:

修改全局变量

如果想在函数内部修改全局变量,需要使用global关键字

x = 10  # 全局变量

def my_function():
    global x  # 声明x是全局变量
    print("Inside function, x =", x)
    x = 20  # 修改全局变量x
    print("Inside function, x =", x)

my_function()
print("Outside function, x =", x)  # x的值也被修改了

在这个例子中,通过使用global关键字,my_function函数内部的修改影响了全局变量x的值。

最佳实践

  • 使用局部变量:尽量使用局部变量,因为它们的作用域有限,有助于避免命名冲突和意外的修改。
  • 谨慎使用全局变量:全局变量可能会导致代码难以理解和维护,因为它们可以在程序的任何地方被修改。如果确实需要使用全局变量,确保它们的使用是必要的,并且明确地使用global关键字声明。

 修改封闭作用域中的变量

如果要修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量则需要nonlocal关键字。nonlocal关键字在Python中用于在嵌套的函数作用域中修改变量。当你有一个嵌套函数,并且想要在内部函数中修改外部函数的变量时,可以使用nonlocal关键字。这与global关键字的作用类似,但nonlocal用于封闭作用域中的变量,而不是全局作用域

nonlocal关键字通常用在闭包(closure)中,即一个函数内定义了另一个函数,内部函数可以访问外部函数的变量。

def outer():
    x = 10  # 外部函数的局部变量

    def inner():
        nonlocal x  # 声明x是封闭作用域中的变量
        print("Inside inner, x =", x)
        x = 20  # 修改外部函数的局部变量x
        print("Inside inner, x =", x)

    inner()
    print("Outside inner, x =", x)

outer()

在这个例子中:

  • outer函数定义了一个局部变量x
  • innner函数是嵌套在outer函数内部的。
  • 在inner函数中,使用nonlocal x声明x是封闭作用域中的变量,即outer函数的局部变量。
  • 在inner函数中修改x的值,这个修改会影响到outer函数中的x。

与global的区别

  • global:用于修改全局作用域中的变量。
  • nonlocal:用于修改封闭作用域中的变量,通常是嵌套函数中的外部函数的局部变量。

注意事项

  • 使用nonlocal时,变量必须在封闭作用域中定义,否则会引发UnboundLocalError。
  • nonlocal关键字不能用于类定义中。

最佳实践

  • 在使用嵌套函数时,如果需要在内部函数中修改外部函数的变量,使用nonlocal关键字。
  • 避免过度使用nonlocal,因为它可能会使代码的可读性和可维护性降低。尽量通过参数传递和返回值来实现函数之间的数据交换。

特殊情况

另外有一种特殊情况,假设下面这段代码被运行:

a = 10
def test():
    a = a + 1
    print(a)
test()

 

错误信息为局部作用域引用错误,因为 test 函数中的 a 使用的是局部,未定义,无法修改。

修改 a 为全局变量:

a = 10
def test():
    global a
    a = a + 1
    print(a)
test()

也可以通过函数参数传递:

a = 10
def test(a):
    a = a + 1
    print(a)
test(a)

输出结果均为:11。如下图:

 内置函数:locals和globals

这两个函数主要提供,基于字典的访问局部和全局变量的方式。locals()和globals()是两个内置函数,分别用于访问当前局部和全局符号表。这些符号表实际上是字典,其中包含了当前作用域中的变量名和它们的值。

在理解这两个函数时,首先来理解一下 Python 中的名字空间概念。Python 使用叫做名字空间的东西来记录变量的轨迹。名字空间只是一个字典,它的键字就是变量名,字典的值就是那些变量的值。

实际上,名字空间可以像 Python 的字典一样进行访问。

每个函数都有着自已的名字空间,叫做局部名字空间,它记录了函数的变量,包括函数的参数和局部定义的变量。每个模块拥有它自已的名字空间,叫做全局名字空间,它记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。还有就是内置名字空间,任何模块均可访问它,它存放着内置的函数和异常。

当一行代码要使用变量 x 的值时,Python 会到所有可用的名字空间去查找变量,按照如下顺序:

  • 1、局部名字空间 - 特指当前函数或类的方法。如果函数定义了一个局部变量 x,Python将使用这个变量,然后停止搜索。
  • 2、全局名字空间 - 特指当前的模块。如果模块定义了一个名为 x 的变量,函数或类,Python将使用这个变量然后停止搜索。
  • 3、内置名字空间 - 对每个模块都是全局的。作为最后的尝试,Python 将假设 x 是内置函数或变量。

如果 Python 在这些名字空间找不到 x,它将放弃查找并引发一个 NameError 的异常,同时传递 There is no variable named 'x' 这样一条信息。

局部变量函数 locals 例子(locals 返回一个名字/值对的字典):

lobals()

  • locals()函数返回一个代表当前局部符号表的字典
  • 这个字典包含了当前作用域中定义的所有变量,包括函数参数和局部变量。
def my_function():
    local_var = 20
    print(locals())

my_function()

输出将类似于: 

{
    'local_var': 20, 
    '__module__': '__main__', 
    '__annotations__': {}, 
    '__doc__': None, 
    ...
}

 locals()返回的字典包含了在函数my_function中定义的所有局部变量。


 

def foo(arg, a):
    x = 1
    y = 'xxxxxx'
    for i in range(10):
        j = 1
        k = i
    print(locals())
#调用函数的打印结果    
foo(1,2)

这段代码定义了一个名为 foo的函数,它接受两个参数 arg和 a。在函数内部,定义了两个局部变量 x和 y,并初始化了它们的值。然后,函数进入一个 for 循环,循环10次,每次循环中定义了两个变量 j 和 k,并分别将 j 初始化为1,将 k 设置为当前循环的索引 i。

在循环结束后,函数打印出当前的局部变量字典 locals()。这个字典包含了函数内所有局部变量的名称和值。

为什么结果是 `{'arg': 1, 'a': 2, 'x': 1, 'y': 'xxxxxx', 'i': 9, 'j': 1, 'k': 9}` 呢?让我们逐步分析:

  1.  arg 和 a 是函数的参数,分别被赋值为1和2。
  2.  x 和 y 是在函数体中定义的局部变量,分别被赋值为1和字符串 'xxxxxx'。
  3.  在 for 循环中,i 从0开始,每次循环递增1,直到9。在循环的最后一次,i 的值是9。
  4. j 在每次循环的开始被重新赋值为1,因此不管循环多少次,j 的值总是1。
  5. k 在每次循环中被赋值为当前的 i 值,因此在最后一次循环中,k 的值也是9。

由于 locals() 返回的是函数执行到当前点的所有局部变量的快照,所以在 for 循环结束后,locals() 包含了所有这些变量及其最终的值。这就是为什么看到的结果是包含所有这些变量及其值的字典。

from module import 和 import module 之间的不同。使用 import module,模块自身被导入,但是它保持着自己的名字空间,这就是为什么需要使用模块名来访问它的函数或属性(module.function)的原因。但是使用 from module import,实际上是从另一个模块中将指定的函数和属性导入到你自己的名字空间,这就是为什么你可以直接访问它们却不需要引用它们所来源的模块的原因。

globals()

  • globals()函数返回一个代表当前全局符号表的字典。
  • 这个字典包含了在模块顶级作用域中定义的所有变量,包括函数、类、导入的模块和变量等。
# 定义一些全局变量
global_var1 = 10
global_var2 = "Hello"

# 打印全局变量字典
print(globals())

 输出将类似于:

{
    '__name__': '__main__', 
    'global_var1': 10, 
    'global_var2': 'Hello', 
    ...
}

globals()返回的字典包含了当前模块的所有全局变量。注意,输出的具体内容可能会根据你定义的其他全局变量而有所不同。

与globals()的区别

locals 是只读的,globals 不是。

locals 不可修改,globals 可以修改,原因是:

  • locals() 实际上没有返回局部名字空间,它返回的是一个拷贝。所以对它进行修改,修改的是拷贝,而对实际的局部名字空间中的变量值并无影响。
  • globals() 返回的是实际的全局名字空间,而不是一个拷贝与 locals 的行为完全相反。

所以对 globals 所返回的 dictionary 的任何的改动都会直接影响到全局变量的取值

z = 6 #定义全局变量  
def foo(arg):  
    x = 1  
    print( locals() )  
    print('x=',x)
    locals()['x'] = 2 #修改的是局部名字空间的拷贝,而实际的局部名字空间中的变量值并无影响。  
    print( locals() )
    print( "x=",x )
 
foo(3)  
print( globals() )
print( 'z=',z )
globals()["z"] = 8 #globals()返回的是实际的全局名字空间,修改变量z的值  
print( globals() )
print( "z=",z )

输出将类似于:

{'arg': 3, 'x': 1}
x= 1
{'arg': 3, 'x': 1}
x= 1
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x10b099358>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'test.py', '__cached__': None, 'z': 6, 'foo': <function foo at 0x10ae48e18>}
z= 6
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x10b099358>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'test.py', '__cached__': None, 'z': 8, 'foo': <function foo at 0x10ae48e18>}
z= 8

注意事项

  • 使用locals()和globals()时要小心,因为不当使用可能会导致代码难以理解和维护。
  • 在嵌套函数中使用locals()时,它返回的是当前函数的局部变量,而不是外部函数的局部变量。
  • 修改locals()或globals()字典中的值会直接影响作用域中的变量,但通常不推荐这样做,因为它可能会导致代码难以追踪和理解。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用语音模块的开发智能家居产品(使用雷龙LSYT201B 语音模块)

在这篇博客中&#xff0c;我们将探讨如何使用 LSYT201B 语音模块 进行智能设备的语音交互开发。通过这个模块&#xff0c;我们可以实现智能设备的语音识别和控制功能&#xff0c;为用户带来更为便捷和现代的交互体验。 1. 语音模块介绍 LSYT201B 是一个基于“芯片算法”的语音…

GS-SLAM Dense Visual SLAM with 3D Gaussian Splatt 论文阅读

项目主页 2024 CVPR (highlight) https://gs-slam.github.io/ 摘要 本文提出了一种基于3D Gaussian Splatting方法的视觉同步定位与地图构建方法。 与最近采用神经隐式表达的SLAM方法相比&#xff0c;本文的方法利用实时可微分泼溅渲染管道&#xff0c;显著加速了地图优化和…

一天工作量压缩成半天!5个ChatGPT高效工作法则!

在信息爆炸的时代&#xff0c;高效的生活方式成为了许多人的追求。如何利用科技手段提升效率&#xff0c;成为了一个热门话题。ChatGPT&#xff0c;作为一款强大的语言模型&#xff0c;为我们提供了全新的解决方案。本文将深入探讨如何利用 ChatGPT 改变你的生活&#xff0c;助…

【SSM详细教程】-13-SpringMVC详解

精品专题&#xff1a; 01.《C语言从不挂科到高绩点》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482 02. 《SpringBoot详细教程》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12789841.html?spm1001.20…

SQL实战训练之,力扣:1532最近的三笔订单

目录 一、力扣原题链接 二、题目描述 三、建表语句 四、题目分析 五、SQL解答 六、最终答案 七、验证 八、知识点 一、力扣原题链接 1532. 最近的三笔订单 二、题目描述 客户表&#xff1a;Customers ------------------------ | Column Name | Type | --------…

Redis进阶:Spring框架中利用Redis实现对象的序列化存储

前言 由于Redis只能提供基于字符串型的操作&#xff0c;而Java中使用的却以类对象为主&#xff0c;所以需要Redis存储的字符串和Java对象相互转换。如果我们自己编写这些规则&#xff0c;工作量是比较大的&#xff0c;因此本文介绍如何使用Spring框架快速实现Java数据类型在Red…

Flask-SocketIO 简单示例

用于服务端和客户端通信&#xff0c;服务端主动给客户端发送消息 前提&#xff1a; 确保安装了socket库&#xff1a; pip install flask-socketio python-socketio服务端代码 from flask import Flask from flask_socketio import SocketIO import threading import timeap…

计算机网络:网络层 —— IPv4 地址的应用规划

文章目录 IPv4地址的应用规划定长的子网掩码变长的子网掩码 IPv4地址的应用规划 IPv4地址的应用规划是指将给定的 IPv4地址块 (或分类网络)划分成若干个更小的地址块(或子网)&#xff0c;并将这些地址块(或子网)分配给互联网中的不同网络&#xff0c;进而可以给各网络中的主机…

2023IKCEST第五届“一带一路”国际大数据竞赛--社交网络中多模态虚假 媒体内容核查top11

比赛链接&#xff1a;https://aistudio.baidu.com/competition/detail/1030/0/introduction PPT链接&#xff1a;https://www.ikcest.org/bigdata2024/zlxz/list/page.html 赛题 社交网络中多模态虚假媒体内容核查 背景 随着新媒体时代信息媒介的多元化发展&#xff0c;各种内容…

Handler、Looper、message进阶知识

Android Handler、Looper、Message的进阶知识 在Android开发中&#xff0c;Handler、Looper和Message机制是多线程通信的核心。为了深入理解并优化它们的使用&#xff0c;尤其是在高并发和UI性能优化中&#xff0c;可以利用一些高级特性。 1. Handler的高阶知识 Handler在基本…

基于SpringBoot的“心灵治愈交流平台”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“心灵治愈交流平台”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能界面图 登录、用户注册界面图 心灵专…

从“摸黑”到“透视”:AORO A23热成像防爆手机如何改变工业检测?

在工业检测领域&#xff0c;传统的检测手段常因效率低下、精度不足和潜在的安全风险而受到诟病。随着科技的不断进步&#xff0c;一种新兴的检测技术——红外热成像技术&#xff0c;正逐渐在该领域崭露头角。近期&#xff0c;小编对一款集成红外热成像技术的AORO A23防爆手机进…

FineReport 分栏报表

将报表中的数据根据所需要的展示的样式将数据进行分栏展示列分栏 报表中数据是横向扩展的,超过一页的数据会显示在下一页,而每页下面会有很大的一片空白区域,不美观且浪费纸张。希望在一页中第一行扩展满后自动到下一行继续扩展 1、新建数据集 SELECT * FROM 公司股票2、内…

C++游戏开发中的多线程处理是否真的能够显著提高游戏性能?如果多个线程同时访问同一资源,会发生什么?如何避免数据竞争?|多线程|游戏开发|性能优化

目录 1. 多线程处理的基本概念 1.1 多线程的定义 1.2 线程的创建与管理 2. 多线程在游戏开发中的应用 2.1 渲染与物理计算 3. 多线程处理的性能提升 3.1 性能评估 3.2 任务分配策略 4. 多线程中的数据竞争 4.1 数据竞争的定义 4.2 多线程访问同一资源的后果 4.3 避…

交换机:端口安全与访问控制指南

为了实现端口安全和访问控制&#xff0c;交换机通常通过以下几种机制和配置来保护网络&#xff0c;防止未经授权的访问和恶意攻击。 01-端口安全 定义及功能 端口安全功能允许管理员限制每个交换机端口可以学习的MAC地址数量。 通过绑定特定的MAC地址到交换机的某一端口上&a…

微信小程序的日期区间选择组件的封装和使用

组件化开发是一种将大型软件系统分解为更小、更易于管理和复用的独立模块或组件的方法。这种方法在现代软件开发中越来越受到重视&#xff0c;尤其是在前端开发领域。微信小程序的日期区间选择组件的使用 wxml 代码 <view><view bind:tap"chooseData">…

【K8S系列】Kubernetes Pod节点CrashLoopBackOff 状态及解决方案详解【已解决】

在 Kubernetes 中&#xff0c;Pod 的状态为 CrashLoopBackOff 表示某个容器在启动后崩溃&#xff0c;Kubernetes 尝试重启该容器&#xff0c;但由于持续崩溃&#xff0c;重启的间隔时间逐渐增加。下面将详细介绍 CrashLoopBackOff 状态的原因、解决方案及相关命令的输出解释。 …

水轮发电机油压自动化控制系统解决方案介绍

在现代水电工程中&#xff0c;水轮机组油压自动化控制系统&#xff0c;不仅直接关系到水轮发电机组的安全稳定运行&#xff0c;还影响着整个水电站的生产效率和经济效益。 一、系统概述 国科JSF油压自动控制系统&#xff0c;适用于水轮发电机组调速器油压及主阀&#xff08;蝶…

论文笔记(五十一)Challenges for Monocular 6-D Object Pose Estimation in Robotics

Challenges for Monocular 6-D Object Pose Estimation in Robotics 文章概括摘要I. 介绍II. 正在进行的研究和常见数据集A. 数据集B. 正在进行的研究问题 III. 未来挑战A. 物体本体B. 可变形和关节物体C. 场景级一致性D. 基准现实性E. 环境影响F. 通用物体操控 IV. 结论 Estim…

HeterGCL 论文写作分析

HeterGCL 论文写作分析 这篇文章&#xff0c;由于理论证明较少&#xff0c;因此写作风格了polygcl是两种风格的。polygcl偏向理论的写作风格&#xff0c;而hetergcl就是实践派的风格 首先看标题&#xff0c;其的重点是Graph contrastive learning Framework。其重点是framewo…