Python的作用域,python中的命名空间是什么

  Python的作用域,python中的命名空间是什么

  本文主要介绍Python命名空间和作用域。名称空间是存储名称和对象之间的映射和绑定关系的地方。更多信息可以参考以下朋友。

  00-1010命名空间1.1内置命名空间1.2全局命名空间1.3本地命名空间2范围2.1全局范围和本地范围2.2范围和名称查找的优先级

  

目录

  名称空间是存储名称和对象之间的映射/绑定关系的地方。对于x=3,Python会申请内存空间存储对象3,然后在名称空间存储名称x和3的绑定关系。del x表示清除绑定关系。

  程序执行过程中最多有三个命名空间。

  

一 名称空间

  它是随着python解释器的启动/关闭而生成/回收的,所以它是第一个加载的命名空间,用来存储一些内置名称,比如内置函数名。

  最大

  内置函数max #内置内置

  

1.1 内建名称空间

  生成/回收的python文件是第二个加载的名称空间,文件执行过程中生成的名称将存储在该名称空间中,例如以下名称

  导入#模块名sys

  X=1 #变量名x

  如果x==1:

  Y=2 #变量名y

  : #函数名

  y=1

  定义栏():

  及格

  类别栏: #类别名称栏

  及格

  

1.2 全局名称空间

  随着函数的调用/结束,临时生成/回收,函数中定义的函数参数和名称都会存储在这个命名空间中。

  def foo(x):

  当y=3 #调用一个函数时,将执行函数代码,名字X和Y存储在函数的本地命名空间中。

  名称空间的加载顺序是:内置名称空间-全局名称空间-本地名称空间,而要找到一个名称,必须从三个名称空间中的一个中找到,搜索顺序是:本地名称空间-全局名称空间-内置名称空间。

  

1.3 局部名称空间

  

二 作用域

  根据名称范围的不同,三个名称空间可以分为两个区域:

  全局作用域:全局命名空间和内置命名空间中的名字属于全局作用域,这个作用域中的名字是全局活的(除非删除,否则在整个文件执行过程中都会存活)和全局有效的(可以在任何地方使用);

  本地作用域:本地命名空间中的名称属于本地作用域。此范围内的名称是临时活动的(即调用函数时临时生成,调用函数后释放)和本地有效的(只能在函数内使用)。

  

2.1 全局作用域与局部作用域

  在局部范围内搜索名字时,起始位置是局部范围,所以先找局部命名空间,再去全局范围:先找全局命名空间,如果找不到,再找内置命名空间,最后会抛出异常。

  X=100 #全局作用域x的名称

  def foo():

  X=300 #本地作用域X的名称

  打印(x) #在本地查找x

  O () #结果是300

  在全局范围内搜索名字时,起始位置是全局范围,所以先搜索全局命名空间,没有找到,再搜索内置命名空间,最后如果没有找到会抛出异常。

  x=100

  def foo():

  X=300 #调用函数时生成局部作用域的名称X

  foo()

  Print(x) #全局寻找x,结果是100

  提示:可以调用内置函数locales()和globals()分别检查局部作用域和全局作用域的名称,结果都是字典格式的。在全局范围内查看的局部变量()的结果等于全局变量()

  Python支持函数的嵌套定义。在嵌入式函数中搜索名字时,会优先从。

  己局部作用域的名字,然后由内而外一层层查找外部嵌套函数定义的作用域,没有找到,则查找全局作用域

  

x=1

  def outer():

   x=2

   def inner(): # 函数名inner属于outer这一层作用域的名字

   x=3

   print(inner x:%s %x)

   inner()

   print(outer x:%s %x)

  outer()

  #结果为

  inner x:3

  outer x:2

  

  在函数内,无论嵌套多少层,都可以查看到全局作用域的名字,若要在函数内修改全局名称空间中名字的值,当值为不可变类型时,则需要用到global关键字

  

x=1

  def foo():

   global x #声明x为全局名称空间的名字

   x=2

  foo()

  print(x) #结果为2

  

  当实参的值为可变类型时,函数体内对该值的修改将直接反应到原值,

  

num_list=[1,2,3]

  def foo(nums):

   nums.append(5)

  foo(num_list)

  print(num_list)

  #结果为

  [1, 2, 3, 5]

  

  对于嵌套多层的函数,使用nonlocal关键字可以将名字声明为来自外部嵌套函数定义的作用域(非全局)

  

def f1():

   x=2

   def f2():

   nonlocal x

   x=3

   f2() #调用f2(),修改f1作用域中名字x的值

   print(x) #在f1作用域查看x

  f1()

  #结果

  3

  

  nonlocal x会从当前函数的外层函数开始一层层去查找名字x,若是一直到最外层函数都找不到,则会抛出异常。

  到此这篇关于Python名称空间与作用域的文章就介绍到这了,更多相关名称空间与作用域内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: