Python中作用域的原理是什么

  介绍

这期内容当中小编将会给大家带来有关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中作用域的原理是什么