一.变量作用域变量作用域(Variable Scope)决定了变量在代码的哪个部分是可见的(可访问的)和可修改的理解作用域对于避免命名冲突、调试错误以及编写模块化代码至关重要。Python遵循LEGB规则来查找变量1.LEGB规则当你在代码中使用一个变量名时Python解释器会按照以下顺序查找该变量L(Local)局部作用域E(Enclosing)嵌套/外层作用域G(Global)全局作用域B(Built-in)内置作用域局部作用域指函数内部在函数内部定义的变量只能在函数内部访问def my_func(): x 10 print(x) print(x) # NameError: name x is not defined嵌套作用域当一个函数定义在另一个函数内部时内部函数可以访问外部函数的变量只读不能修改如果要修改要使用nonlocal关键字嵌套作用域外层函数内部内层函数外部中定义的变量在该嵌套作用域中被访问和修改def outer(): a Outer def inner(): b Inner print(a, b) inner() outer() # Outer Innerdef outer(): a Outer def inner(): b Inner a Hello Python print(a, b) inner() print(a) outer() # Hello Python Inner # Outer这里修改了a吗其实并没有inner()函数内部对a赋值其实只是新创建了一个局部变量aa的值为“Hello Python”外层a的值其实并没有修改def outer(): a Outer def inner(): nonlocal a # 使用nonlocal关键字声明变量a是外层作用域的变量而非局部变量 b Inner a Hello Python print(a, b) inner() print(a) outer() # Hello Python Inner # Hello Python全局作用域全局作用域中的变量是在文件顶层定义的变量可以在文件的任何函数中读取若要在函数中修改全局作用域中的变量要使用global关键字x Java and Python and C def my_function(): x C and JavaScript my_function() print(x) # Java and Python and Cx Java and Python and C def my_function(): global x # 使用global关键字声明变量x是一个全局变量 x C and JavaScript # 对全局变量x进行修改 my_function() print(x) # C and JavaScript内置作用域如果没有自己定义的变量Python会使用内置的名称# 没有定义len变量 print(len(hello)) # 5 Python解释器会查找并使用内置的len()函数# 自己定义了len变量 那么它会遮盖内置的len()函数 len 100 print(len(hello)) # TypeError: int object is not callable可变对象的修改和赋值这是一个常见的误区。如果变量指向的是可变对象如列表、字典你可以在不声明global/nonlocal的情况下修改对象的内容但不能重新赋值该变量名。my_list [1, 2, 3] def modify_list(): # 合法修改对象内容没有改变变量名 my_list 的指向 my_list.append(4) # 非法重新赋值变量名这会创建一个新的局部变量 my_list # my_list [10, 20] modify_list() print(my_list) # 输出: [1, 2, 3, 4]