Python局部变量与全局变量:正确使用指南与作用域详解

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Python中的变量是什么

变量是一个名称,它引用计算机内存中的某个对象。在Python中,变量没有固定的类型。类型属于变量所引用的对象。

x = 42
x = "现在是字符串"

Python中的局部变量

局部变量的定义

局部变量在函数内部定义,并且只能在该函数内部访问。函数执行完毕后,局部变量会从内存中删除。

def say_hello():
    name = "Python"  # 局部变量
    print("你好,", name)

say_hello()
# print(name)  # 错误:name未定义

变量name只存在于say_hello函数内部,在函数外部无法访问。

局部变量的优势

局部变量确保数据隔离,防止程序其他部分意外修改其值。函数执行完毕后,它们会自动释放内存。

Python中的全局变量

什么是全局变量

全局变量在所有函数外部声明,可以在程序文件的任何位置访问。这类变量在程序运行的整个过程中保持其值不变。

language = "Python"  # 全局变量

def show():
    print("语言:", language)

show()  # 语言:Python

修改全局变量时的问题

在函数内部尝试修改全局变量时,会出现错误:

counter = 0

def increment():
    counter += 1  # UnboundLocalError!

由于赋值操作,Python将counter解释为局部变量,但它并未在局部定义。

global关键字

使用global修改全局变量

global关键字允许在函数内部修改全局变量:

count = 0

def increment():
    global count
    count += 1

increment()
print(count)  # 1

在数学运算中使用global

total = 0

def add(x):
    global total
    total += x

add(10)
add(20)
print(total)  # 30

何时使用global

应谨慎使用global关键字,因为它可能使程序调试变得复杂,并降低代码的可读性。

作用域:LEGB规则

变量查找原则

Python按照LEGB规则查找变量,顺序如下:

  • L(Local)— 当前函数内部
  • E(Enclosing)— 嵌套函数中
  • G(Global)— 模块级别
  • B(Built-in)— Python内置名称

LEGB规则示例

x = "global"

def outer():
    x = "enclosing"
    
    def inner():
        x = "local"
        print(x)
    
    inner()

outer()  # local

Python在局部作用域中找到变量x,并使用其值。

nonlocal关键字

访问嵌套函数的变量

nonlocal关键字用于操作来自外部(但非全局)作用域的变量:

def outer():
    count = 0
    
    def inner():
        nonlocal count
        count += 1
        return count
    
    return inner

f = outer()
print(f())  # 1
print(f())  # 2

global与nonlocal的区别

global关键字操作模块级别的变量,而nonlocal操作同一作用域内外部函数的变量。

博客

书籍推荐