Skip to content

变量作用域

在 Python 中,每个变量都有明确定义的作用域 (scope),即它可以被程序的某一部分访问,并且不能从其作用域之外访问。

根据其作用域,有两种类型的变量:

局部变量 (Local Variables)

局部变量在函数或代码块内部定义,并且只能在其定义的地方访问。

它们仅在函数或代码块执行期间存在。

代码

python
def triple(a):
    result = 3*a
    #变量 result 只能在函数内部访问
    print("函数内部:", result)

#输出函数内部 result 的值
triple(3)

#会引发错误,因为 result
#在函数 triple() 作用域之外无法访问
#print("函数外部:", result) # 取消注释会报错

输出

函数内部: 9
#如果取消注释 print("函数外部:", result),会看到:
#Traceback (most recent call last):
#File "<stdin>", line 1, in <module>
#NameError: name 'result' is not defined

全局变量 (Global Variables)

在任何函数或代码块之外定义的变量称为全局变量。

它们通常用于指定数学常量、文件路径或其他此类值,并且可以在源代码的任何地方(由函数或代码块)访问。

下面的示例演示了如何访问全局变量 n

代码

python
n = 10 # 全局变量

def uno():
  print("uno 中的 n:", n) # 访问全局 n

def tres():
  print("tres 中的 n*3:", n*3) # 访问全局 n

uno()
tres()

输出

uno 中的 n: 10
tres 中的 n*3: 30

如果在函数内部定义了一个与全局变量同名的变量,则该变量被视为局部变量,所有对该变量的引用都指向此局部变量,而不是全局变量。这称为遮蔽 (shadowing)

代码

python
n = 10 # 全局变量

#函数内部的局部 n
def uno():
  n = 5 # 定义了一个新的局部变量 n,遮蔽了全局 n
  print("uno 中的局部 n:", n)

#函数内部访问全局 n
def tres():
  print("tres 中的全局 n*3:", n*3)

uno()
tres()
print("全局 n 仍然是:", n) # 全局 n 未被 uno() 修改

输出

uno 中的局部 n: 5
tres 中的全局 n*3: 30
全局 n 仍然是: 10

要在函数内部修改全局变量的值,可以使用 global 关键字声明该变量。

代码

python
n = 10 # 全局变量

#函数修改全局 n 的值
def uno():
  global n # 声明 n 是全局变量
  n = 5 # 修改全局变量 n
  print("uno 修改后的全局 n:", n)

def tres():
  print("tres 中现在的全局 n*3:", n*3) # 使用修改后的全局 n

uno()
tres()
print("现在的全局 n 是:", n)

输出

uno 修改后的全局 n: 5
tres 中现在的全局 n*3: 15
现在的全局 n 是: 5

注意: 过度使用 global 会降低代码的可读性和可维护性,通常建议通过函数参数和返回值来传递数据。