本专栏系列为Pythong基础系列,每篇内容非常全面,包含全网各个知识点,非常长,请耐心看完。
每天都会更新新的内容,搜罗全网资源以及自己在学习和工作过程中的一些总结,可以说是非常详细和全面。
以至于为什么要写的这么详细:自己也是学过Python的,很多新手只是简单的过一篇语法,其实对于一个知识点的底层逻辑和其他使用方法以及参数详情根本不是很了解,这就导致学完很容易忘记,而且在实战过程中也是半知半解,所以自己就尽量写的详细些,让需要的人能更了解Python的每一个知识点,也感谢大家指正,祝大家早日从小码农变成大牛!
编程不仅是技术的堆砌,更是灵魂的创造,每一次代码的跳动,都是向世界宣告你的不凡!
- 博客主页:长风清留扬-优快云博客
- 系列专栏:Python基础专栏
- 每天更新大数据相关方面的技术,分享自己的实战工作经验和学习总结,尽量帮助大家解决更多问题和学习更多新知识,欢迎评论区分享自己的看法
- 感谢大家点赞👍收藏⭐评论
思维导图与知识点整理
作用域的分类
Python中的作用域主要分为四种类型,这些类型按照从内到外的顺序排列:
- 局部作用域(Local Scope):这是最直接的作用域,它包含了函数内部定义的变量。这些变量只能在函数体内被访问和修改。当函数执行完毕后,这些局部变量通常会被销毁(除非它们被作为返回值或以某种方式传递到外部作用域)。
- 嵌套作用域(Enclosing Scope 或 Nonlocal Scope):当一个函数内部定义了另一个函数时,内层函数可以访问外层函数定义的变量,这些变量对于内层函数来说就是非局部(nonlocal)的。然而,外层函数不能直接访问内层函数定义的变量,除非这些变量被显式地作为返回值或全局变量。
- 全局作用域(Global Scope):全局作用域包含了在模块级别定义的变量。这些变量在整个模块内部都是可见的,包括在模块内部定义的所有函数中。在函数内部,可以通过global关键字来声明一个变量是全局的,从而允许在函数内部修改全局变量的值。
- 内置作用域(Built-in Scope):这是Python解释器提供的特殊作用域,包含了Python的内置函数和异常。这个作用域在全局作用域之前被搜索,但它对程序员来说是只读的,不能修改内置作用域中的变量或函数。
LEGB规则
Python解释器在查找变量时遵循LEGB规则,即按照以下顺序搜索变量:
- Local(局部作用域):首先在当前函数或代码块中查找变量。
- Enclosing(嵌套作用域):如果局部变量中没有找到,Python会向外层函数(如果有的话)查找变量。
- Global(全局作用域):如果嵌套作用域中也没有找到,Python会在全局作用域中查找变量。
- Built-in(内置作用域):最后,Python会在内置作用域中查找变量。
变量的生命周期
变量的生命周期与其作用域紧密相关。局部变量在函数被调用时创建,在函数执行完毕后销毁(除非它们被返回或以其他方式传递到外部)。全局变量在模块被加载时创建,在模块被卸载时销毁。内置变量则与Python解释器的生命周期相同。
注意事项
- 变量遮蔽(Shadowing):在内部作用域中定义一个与外部作用域同名的变量时,内部作用域的变量会遮蔽外部作用域的变量。这意味着在内部作用域中,只能访问到内部定义的变量,而无法访问到被遮蔽的外部变量。
- global和nonlocal关键字:global关键字用于在函数内部声明一个变量是全局的,从而允许修改全局变量的值。nonlocal关键字用于在嵌套函数中声明一个变量是非局部的,即它是外层函数定义的局部变量,从而允许在嵌套函数中修改这个非局部变量的值。
局部作用域(Local)
局部作用域是最内层的作用域,它包含在函数或lambda函数内定义的变量。这些变量只能在函数或lambda函数内部访问。当函数执行完毕时,这些局部变量将被销毁(除非它们被返回或被以某种方式保存到全局作用域中)。
定义与创建
局部作用域是在函数或代码块(如if语句、for循环或while循环)执行时创建的。在这个作用域内定义的变量就是局部变量。当函数或代码块执行完毕后,局部作用域会被销毁,同时其中的局部变量也会被销毁(除非它们被作为返回值或以其他方式传递到外部作用域)。
访问与修改
局部变量只能在定义它们的函数或代码块内部被访问和修改。在函数或代码块外部尝试访问这些变量会导致NameError异常,因为外部作用域中不存在这些变量。
变量遮蔽
如果在一个作用域内部定义了与外部作用域同名的变量,内部作用域的变量会遮蔽外部作用域的变量。这意味着在内部作用域中,只能访问到内部定义的变量,而无法访问到被遮蔽的外部变量。这种遮蔽机制是作用域解析的一个重要方面。
案例
def my_function():
local_var = "I am local" # 定义一个局部变量
print(local_var) # 在函数内部访问局部变量
my_function() # 输出: I am local
# 尝试在函数外部访问局部变量会导致NameError
# print(local_var) # 这会抛出NameError
# 变量遮蔽示例
x = "I am global"
def another_function():
x = "I am local and shadowing the global x"
print(x) # 访问局部作用域中的x
print(x) #