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操作同一作用域内外部函数的变量。