变量作用域
在 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
会降低代码的可读性和可维护性,通常建议通过函数参数和返回值来传递数据。