新手易犯错的地方Python作用域
好多新手一开始比较容易犯错的地方
理解作用域对于编写高效的python代码十分重要
现在就讲下四种作用域,按照从内到外的顺序:
- 局部作用域(Local) - 在函数内部定义的变量
- 嵌套作用域(Enclosing) - 在嵌套函数中,外层函数的作用域
- 全局作用域(Global) - 在模块级别定义的变量
- 内置作用域(Built-in) - Python内置的变量名(如print, len等)
作用域规则:LEGB
Python使用LEGB规则来查找变量名:
- 先在Local作用域查找
- 找不到则在Enclosing作用域查找
- 还找不到则在Global作用域查找
- 最后在Built-in作用域查找
- 如果都找不到,则抛出NameError
示例
1. 局部作用域(Local)
def func():
x = 10 # 局部变量
print(x)
func() # 输出: 10
print(x) # 报错: NameError: name 'x' is not defined
2. 嵌套作用域(Enclosing)
def outer():
y = 20 # 嵌套作用域变量
def inner():
print(y) # 可以访问外部函数的变量
inner()
outer() # 输出: 20
3. 全局作用域(Global)
z = 30 # 全局变量
def func():
print(z) # 可以访问全局变量
func() # 输出: 30
4. 内置作用域(Built-in)
print(len("hello")) # len是内置函数
修改作用域变量
修改全局变量
要使用global关键字:
count = 0
def increment():
global count
count += 1
increment()
print(count) # 输出: 1
修改嵌套作用域变量
Python 3中使用nonlocal关键字:
def outer():
num = 10
def inner():
nonlocal num
num = 20
inner()
print(num) # 输出: 20
outer()
常见注意事项
- 变量遮蔽(Shadowing): 局部变量会遮蔽同名的全局变量
x = 10
def func():
x = 20 # 这是一个新的局部变量
print(x) # 输出: 20
func()
print(x) # 输出: 10 (全局变量未被修改)
循环和条件语句没有独立作用域:
for i in range(5):
pass
print(i) # 输出: 4 (i仍然存在)
类定义中的特殊作用域:
class MyClass:
x = 10 # 类变量
def method(self):
print(x) # 错误! 不能直接访问类变量
print(self.x) # 正确
这个必须要理解,这个没办法理解直接放弃吧,
看官点个赞呗