这期内容当中小编将会给大家带来有关Python中作用域的原理是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
Python主要用来做什么
Python主要应用于:1,网络开发;2、数据科学研究;3,网络爬虫;4、嵌入式应用开发,5日游戏开发;6桌面应用开发。
Python具有静态作用域,变量的作用域由它定义的位置决定,而与调用的位置无关。
,=2,
引用>
def f ():
, 2=
第一行的一个的作用域是全局作用域,作用于定义位置后面的所有位置。
第四行的一个的作用域是局部作用域,作用于f函数里。
Python能够形成局部作用域的只有函数与类,其他语句不形成局部作用域。
函数与类的局部作用域
def f (): a 才能=1 class 一个: 时间=b 才能;2 if 1,==, 1: 时间=c 才能;3 for _ 拷贝范围(1): d 才能=4 while 真正的: e 才能=5 ,打破 打印(c, d, e) 试一试: 打印(a)才能 except Exception  as e: 打印(e)才能 试一试: 打印(b)才能 except Exception  as e: 打印才能(e)输出结果
, 3 4 5
引用>
,名字& # 39;一个# 39;没有定义
,名字& # 39;b # 39;没有定义
python动态运行时,每个作用域都有三个名字空间:由局部变量组成的当地的名字空间,由全局变量组成的全球名字空间,以及python内建模块的内置命令名字空间,在查询一个变量时,搜索顺序为当地→全球→内置命令即局部变量屏蔽全局变量,全局变量屏蔽内建变量。
python的全球名字空间是动态的,即每遇到一个赋值语句(def与类也属于赋值语句),全球名字空间都可能发生变化。
全球名字空间的动态变化
,打印(dir ())
引用>
,一个=1
,打印(dir ())
, b=2
,打印(dir ())
输出结果
1 [& # 39; __annotations__& # 39; & # 39; __builtins__& # 39;, & # 39; __cached__& # 39;, & # 39; __doc__& # 39;, & # 39; __file__ # 39;, & # 39; __loader__& # 39;, & # 39; __name__ # 39;, & # 39; __package__& # 39;, & # 39; __spec__& # 39;]
引用>
2 (& # 39; __annotations__& # 39; & # 39; __builtins__& # 39;, & # 39; __cached__& # 39;, & # 39; __doc__& # 39;, & # 39; __file__ # 39;, & # 39; __loader__& # 39;, & # 39; __name__ # 39;, & # 39; __package__& # 39;, & # 39; __spec__& # 39;, & # 39;一个# 39;]
3 (& # 39; __annotations__& # 39; & # 39; __builtins__& # 39;, & # 39; __cached__& # 39;, & # 39; __doc__& # 39;, & # 39; __file__ # 39;, & # 39; __loader__& # 39;, & # 39; __name__ # 39;, & # 39; __package__& # 39;, & # 39; __spec__& # 39;, & # 39;一个# 39;,& # 39;b # 39;]
从输出结果可以看的出,全球名字空间是动态增加的。
这意味着,虽然位于全球性的名字空间的变量叫做全局变量,它的作用范围也不是全局位置,它只作用于第一次赋值之后的位置,因为只有在变量赋值初始化的时候,它才会被加入到全球名字空间中。
函数和类搜索的全球名字空间是调用位置的全球名字空间,与定义位置无关
def f (): 打印(a)才能 试一试: f()才能 except Exception  as e: 打印(e)才能 时间=a 2 f ()输出结果
名称& # 39;一个# 39;没有定义
2
函数f打印全局变量,一个在第9行定义。在第五行调用f的时候,一个不在全球名字空间中,所以会输出错误信息,在第十行再次调用函数f时,一个已经加入了全球名字空间,所以能够打印出。
python为了提高效率,当地的名字空间是静态实现的,因为对于一个函数来说,它所包含的局部变量是明确已知的。
函数的当地的名字空间是静态的
a =, 4 def f (): 尝试才能: ,,,(a)打印 except 才能;Exception  as e: ,,,印刷(e) a 才能=1 f ()输出结果
,局部变量& # 39;一个# 39;引用之前赋值
在打印一个的时候,在当地的名字空间中找到了一个,但是这时候一并没有赋值初始化,所以抛出异常。这也说明了当地的名字空间与全球名字空间不同,它会在一开始就把所有的局部变量加入到名字空间中。
Python中作用域的原理是什么