新手易犯错的地方Python作用域

好多新手一开始比较容易犯错的地方

理解作用域对于编写高效的python代码十分重要

现在就讲下四种作用域,按照从内到外的顺序:

  1. 局部作用域(Local) - 在函数内部定义的变量
  2. 嵌套作用域(Enclosing) - 在嵌套函数中,外层函数的作用域
  3. 全局作用域(Global) - 在模块级别定义的变量
  4. 内置作用域(Built-in) - Python内置的变量名(如print, len等)

作用域规则:LEGB

Python使用LEGB规则来查找变量名:

  1. 先在Local作用域查找
  2. 找不到则在Enclosing作用域查找
  3. 还找不到则在Global作用域查找
  4. 最后在Built-in作用域查找
  5. 如果都找不到,则抛出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()

常见注意事项

  1. 变量遮蔽(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)  # 正确

这个必须要理解,这个没办法理解直接放弃吧,

看官点个赞呗

相关文章

python变量作用域详解

python变量的一生包括变量的申明,引用和修改及消亡,此文主要关注变量的引用和修改。变量从作用域来分主要包括全局变量,嵌套(外部)变量,局部变量。一,全局变量,一般定义在模块顶部,对整个模块都生效,...

看一看,Python这四种作用域你都知道吗?

点赞、收藏、加关注,下次找我不迷路一、啥是作用域?先打个比方比如说,你在自己的卧室(相当于一个小空间)里放了一本书,这本书在卧室里随便你怎么看,这就是这本书在卧室这个 "作用域" 内...

一文读懂Python中的全局变量局部变量和作用域

通常小白在写代码时,只知道引用变量来应对一些基础的编码问题,当面试官问及局部变量和全局变量的具体细节时,就会一脸懵逼,傻傻分不清楚!其实想要彻底了解局部变量和全局变量的关系,本质是大家需要明白何为作用...

新手学Python避坑,学习效率狂飙! 五、Python循环中的变量作用域

在 Python 里,变量的作用域指的是变量可被访问的代码范围。循环里的变量作用域在 Python 中是个常见且关键的概念。一、变量作用域Python 里的变量作用域主要有局部作用域和全局作用域。1、...

Python闭包实现:nonlocal关键字与变量作用域

在Python编程中,闭包是一个强大而优雅的特性,它允许函数捕获并记住其定义环境中的变量值。通过闭包,可以创建更加灵活和模块化的代码结构。而nonlocal关键字的引入,则进一步增强了Python闭包...