局部变量与全局变量的区别

2025年3月17日 | 阅读 7 分钟

任何编程语言中的变量都起着至关重要的作用。根据变量的作用域,它们被分为全局变量和局部变量。全局变量和局部变量之间的主要区别在于,全局变量可以在整个程序中全局访问,而局部变量只能在定义它们的函数或代码块内访问。在本主题中,我们将首先了解什么是变量和作用域,以及局部变量、全局变量,然后是两者的区别。

Local variable vs Global Variable

什么是变量?

变量是为计算机程序中的内存位置指定的名称,用于存储值。它用于存储可以在程序中引用和操作的信息。

我们可以为变量选择任何名称,但它必须遵循编程的语义。例如,可以是a, b, x, y, z, sub, div, total, avg 等。

假设我们希望在程序中存储和使用两个值,10 和 20。为此,我们需要使用变量,我们将执行以下步骤:

  • 首先,我们将创建一个具有合适名称的变量或声明一个变量。
  • 将这些值分配给变量以进行存储。
  • 一旦这些值被存储,我们就可以在程序中使用这些变量及其名称。
Local variable vs Global Variable

正如我们在上面的图片中看到的,有两个内存单元,001 和 002,我们将这些位置命名为 A 和 B。A 包含 10,B 包含 20。

不同的编程语言有不同的声明变量的方式。例如,在 C 语言中,我们可以按以下方式声明变量:

语法:(C 语言中的变量声明语法)

示例

变量的作用域

每个变量都在其作用域内定义和使用,并决定了该变量在程序中的可用性。作用域意味着该变量的生命周期。这意味着变量只能在其作用域内访问或可见。

变量的作用域可以在声明时定义,变量主要有两种声明方式:

  • 全局变量: 在所有函数之外
  • 局部变量: 在函数代码块内

什么是全局变量?

  • 全局变量是声明在所有函数或代码块之外的变量,可以在程序中全局访问。
  • 程序中的任何函数都可以访问它。
  • 一旦我们声明了一个全局变量,它的值就可以在不同的函数中使用时发生变化。
  • 全局变量的生命周期一直存在到程序执行完毕。这些变量存储在编译器分配的固定内存位置,并且不会自动清理。
  • 全局变量在编程中很常用,并且对于所有函数都需要访问相同数据的场景很有用。

示例

在上面的示例中,a 和 b 是全局变量。

全局变量的优点

  • 程序中的所有函数都可以访问全局变量。
  • 只需要声明一次。
  • 如果所有函数都在访问相同的数据,则非常有用。

全局变量的缺点

  • 全局变量的值可能会被意外更改,因为它可被程序中的任何函数使用。
  • 如果使用大量全局变量,程序出错的可能性会很高。

什么是局部变量?

  • 在函数代码块内或内部声明的变量称为局部变量。
  • 这些变量只能在声明它们的函数内访问。
  • 局部变量的生命周期仅限于其函数内部,这意味着变量在函数执行期间存在。一旦函数执行完成,局部变量就会被销毁,并且在函数外部不再存在。
  • 局部变量作用域有限的原因是局部变量存储在堆栈中,堆栈是动态的,会根据存储在其内部的数据自动清理。
  • 但是,通过使用“static”关键字将变量声明为静态,我们可以保留局部变量的值。

示例

在上面的示例中,我们在 main 函数中声明了两个变量 x 和 y。因此,它们是局部变量。

局部变量的优点

  • 不同函数可以使用相同名称的局部变量,因为它只被声明它的函数识别。
  • 局部变量仅在使用函数执行期间占用内存;之后相同的内存位置可以被重用。

局部变量的缺点

  • 局部变量的作用域仅限于其函数,其他函数无法使用。
  • 不允许通过局部变量进行数据共享。

全局变量与局部变量的比较表

全局变量局部变量
全局变量在所有函数代码块之外声明。局部变量在函数代码块内声明。
作用域在整个程序中有效。作用域有限,仅限于声明它的函数内部。
全局变量的任何更改都会影响整个程序,无论它在哪里被使用。局部变量的任何更改都不会影响程序的其他函数。
全局变量在程序执行期间一直存在于程序中。局部变量在函数执行时创建,一旦执行完成,变量就会被销毁。
程序中的所有函数都可以访问它。只能被声明它的函数语句访问,不能被其他函数访问。
如果全局变量未初始化,它默认取值为零。如果局部变量未初始化,它默认取值为垃圾值。
全局变量存储在内存的数据段中。局部变量存储在内存的堆栈中。
我们不能声明多个同名变量。我们可以在不同函数中声明多个同名变量。

示例:理解局部变量与全局变量的区别

现在,让我们通过不同编程语言的示例来更好地理解局部变量和全局变量之间的区别。

C 语言中的局部与全局

示例-1

输出

The addition result is: 120
The Multiplication result is: 200
30

正如我们在上面的程序中看到的,我们使用了全局变量 a 和 b,它们在 Add() 和 main() 等不同函数中被访问。而也有局部变量 c、d、Ans1 和 Ans2,它们只在声明它们的函数中被访问。如果我们尝试在 Mul() 函数之外使用 c 和 d 变量,它们将被视为新变量。就像我们在 main() 函数中也使用 c 一样,它被视为一个新变量。

如果我们尝试在 Mul() 函数之外使用 c 和 d 变量,它们将被视为新变量。就像我们在 main() 函数中也使用 c 一样,它被视为一个新变量。

Python 中的局部与全局

示例-1

输出

Hey, I am a Local Variable!, I can be used within this block only in the program.
Hey, I am Global Variable!, I can be used everywhere in the program.

在上面的程序中,我们使用了一个全局变量 v1 和一个局部变量 v2。由于 v1 是全局的,可以在任何函数中轻松访问,而 v2 是局部的;它只在声明它的函数中使用。但是,如果我们尝试在 func1 中使用 v1,它将导致错误。让我们看下面的例子:

示例-2

如果我们尝试访问 v1,它可以在 func1 和 func2 中轻松访问。但是,如果我们尝试在它的函数之外访问 v2,也就是说在 func2 中,它将导致运行时错误。执行上述代码后,我们将得到以下输出:

运行时错误

NameError: global name 'v2' is not defined

输出

Hey, I am Local Variable!, I can be used within this block only in the program.
Hey, I am Global Variable!, I can be used everywhere in the program.
Hey, I am Global Variable!, I can be used everywhere in the program.

Java 中的局部变量与全局变量

在 Java 中,没有全局变量的概念;由于 Java 是一种面向对象的编程语言,一切都属于类的一部分。但是,如果我们想使一个变量全局可访问,我们可以使用 static 关键字将其声明为静态。

输出

Value of non-static variable is: 20
Value of static variable is:10

在上面的程序中,我们使用了一个局部变量(非静态变量)和一个静态变量。局部变量可以通过 Demo 类的对象来访问,而静态变量可以通过类的名称来访问。


下一主题区别