全局变量和局部变量有没有区别,如果有,是什么?

本文详细介绍了变量的分类,包括全局变量、静态全局变量、静态局部变量和局部变量,并阐述了它们的作用域和存储方式。同时,文章还解释了如何在不同函数中使用相同名称的变量以及全局变量的使用注意事项。

一、变量的分类

       变量可以分为:全局变量、静态全局变量、静态局部变量和静态变量。

       按存储区域分,全局变量、静态全局变量、静态局部变量都存放在内存的静态存储区域,局部变量存放在内存的栈区。

       按作用域分,全局变量在整个工程文件内都有效;静态全局变量只在定义它的文件内有效;静态局部变量只在定义它的函数内有效,只是程序仅分配一次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但函数返回后失效。

       全局变量和静态变量如果没有手工初始化,则由编译器初始化为0。局部变量的值不可知。

       全局变量是没有定义存储类型的外部变量,其作用域是从定义点到程序结束。省略了存储类型符,默认是自动型。

       静态全局变量是定义存储类型为静态型的外部变量,其作用域是从定义点到程序结束,所不同的是存储类型决定了存储地点,静态型变量是存放在内存的数据区中的,它们在程序开始运行前就分配了固定的字节,在程序运行过程中被分配的字节大小是不改变的。只有程序运行结束后,才释放所占用的内存。静态全局变量只本文件内可用。

       自动型变量存放在堆栈区中。堆栈区也是内存中的一部分,该部分内存在程序运行中是重复使用的。

二、介绍变量的作用域

       1、局部变量。局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内,离开该函数后再使用这种变量是非法的。

关于局部变量的作用域还要说明以下几点:

        (1)主函数中定义的变量也只能在主函数中使用,不能在其他函数中使用。同时,主函数中也不能使用其他函数中定义的变量。因为主函数也是一个函数,它与其他函数是平行关系。这一点与其它语言不同,应予以注意。

        (2)形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。

        (3)允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。

        (4)在复合语句中也可以定义变量,其作用域只在复合语句范围内。

       2、全局变量。全局变量也称为外部变量,它是在函数外部定义的变量。它不属于一个函数,它属于一个源程序文件,其总用域是整个源程序。在函数中使用全局变量,一般应作全局变量说明。只有在函数内经过说明的全局变量才能使用。全局变量的说明符为extern。但在一个函数之前定义的全局变量,在该函数内不可再加以说明。

对于全局变量还有以下几点说明:

         (1)对于全局变量的定义和说明,可以不加区分。而对于外部变量则不然,外部变量的定义和外部变量的说明并不是一回事。外部变量定义必须在所有函数之外,且只能定义一次。其一般形式为:

            [extern] 类型说明符 变量名,变量名...其中方括号内的extern可以省去不写。

            例如:int   a,b;

            等效于:

            extern int a,b;

        而外部变量说明出现在要使用该外部变量的各个函数内,在整个程序内,可能出现多次,外部变量说明的一般形式为:extern 类型说明符 变量名,变量名,...;外部变量在定义时就已分配了内存单元,外部变量定义可做初始赋值,外部变量说明不能再被赋初值,只是表明在函数内要使用某外部变量。

       (2)外部变量可加强函数模块之间的数据联系,但是又使函数要依赖这些变量,从模块化程序设计的观点来看这是不利的,因此不必要时尽量不要使用全局变量。

       (3)在同一源文件中,允许全局变量和局部变量同名。在局部变量的作用域内,全局变量不起作用。

<think>我们正在讨论VisionMaster中的全局变量局部变量区别。根据用户提供的引用之前的回答,我们可以总结如下:1.作用域:-局部变量:仅在定义它的函数或代码块内部有效。例如在函数内部定义的变量,函数执行完毕后变量就会被销毁[^3]。-全局变量:在整个脚本或模块中都有效,可以在多个函数之间共享数据。2.生命周期:-局部变量:在函数或代码块执行时创建,执行完毕后销毁。-全局变量:从定义开始直到整个脚本执行结束才销毁。3.修改方式:-在函数内部修改全局变量需要使用`global`关键字声明,否则会被认为是局部变量[^3]。4.内存管理:-局部变量在函数结束后自动释放,而全局变量会一直存在直到程序结束。5.使用场景:-局部变量:用于临时存储中间结果,避免命名冲突,提高代码可读性模块化。-全局变量:用于在多个函数或模块间共享数据,但要谨慎使用以避免不可预测的副作用。示例代码对比:```python#全局变量示例global_counter=0#全局变量defincrement_counter():globalglobal_counter#声明使用全局变量global_counter+=1#局部变量示例defcalculate_area(radius):pi=3.14159#局部变量returnpi*radius**2```注意事项:-避免过度使用全局变量,因为可能导致代码难以维护调试。-在VisionMaster的脚本流程中,通常建议使用局部变量来处理中间图像数据,除非需要跨多个步骤共享数据[^3]。[^3]:引用自VisionMasterPython脚本开发指南§§相关问题§§1.在VisionMaster中如何安全地使用全局变量?2.为什么在函数内部修改全局变量需要global关键字?3.VisionMaster中局部变量的内存管理机制是什么?</think>### VisionMaster中全局变量局部变量区别 在VisionMaster的Python脚本环境中,全局变量局部变量在作用域、生命周期使用场景上有本质区别: #### 1. **作用域范围** | **变量类型** | **作用域** | **访问范围** | |--------------|--------------------------------|--------------------------| | 局部变量 | 仅在定义它的函数/代码块内有效 | 函数内部或当前执行流程中 | | 全局变量 | 整个脚本文件内有效 | 跨函数、跨处理步骤 | **示例对比**: ```python # 全局变量(文件级作用域) GLOBAL_THRESH = 128 # 任何函数都可访问[^3] def process_image(): # 局部变量(函数级作用域) local_kernel = np.ones((5,5), np.uint8) # 仅在函数内有效 return cv2.erode(img, local_kernel) # 可访问全局变量 print(f"全局阈值: {GLOBAL_THRESH}") # 不可访问局部变量(报错) # print(local_kernel) ``` #### 2. **生命周期** | **特性** | 局部变量 | 全局变量 | |----------------|------------------------------|------------------------------| | **创建时机** | 函数/代码块执行时创建 | 脚本加载时创建 | | **销毁时机** | 函数执行结束立即释放[^3] | 整个脚本执行完毕才释放 | | **内存占用** | 临时占用,自动回收 | 持久占用,需谨慎管理 | #### 3. **修改规则** - **局部变量**:函数内可直接修改 ```python def adjust_brightness(): factor = 1.2 # 局部变量 factor += 0.3 # 直接修改 ``` - **全局变量**:函数内修改需显式声明`global` ```python ERROR_COUNT = 0 # 全局变量 def detect_errors(): global ERROR_COUNT # 必须声明 ERROR_COUNT += 1 # 否则创建同名局部变量 ``` #### 4. **使用场景对比** | **场景** | 推荐变量类型 | 原因说明 | |------------------------|--------------|------------------------------| | 中间图像处理结果 | 局部变量 | 避免内存堆积,自动释放资源 | | 跨流程共享参数 | 全局变量 | 如系统配置阈值 | | 临时计算存储 | 局部变量 | 防止命名冲突 | | 累计统计值(如缺陷数) | 全局变量 | 需持久化保存 | #### 5. **常见问题** - **变量覆盖**:局部变量全局变量同名时,函数内优先访问局部变量 ```python scale = 1.0 # 全局变量 def resize_image(): scale = 0.8 # 局部变量覆盖全局 # 此处scale=0.8,全局scale不变 ``` - **数据传递**: - 局部变量 → 外部:通过`return`返回值 - 全局变量 → 函数:直接读取(修改需`global`) > 最佳实践:优先使用局部变量,仅在必要场景(如配置参数、状态跟踪)使用全局变量,并用大写命名区分(如`CONFIG_THRESH`)[^3]。 [^3]: 引用自VisionMaster Python脚本开发指南
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值