Python分享:命名空间和作用域的基础知识整合

Posted 梦子mengy7762

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python分享:命名空间和作用域的基础知识整合相关的知识,希望对你有一定的参考价值。

什么是命名空间?

命名空间是一个系统,它对Python中的每个对象都有一个唯一的名称。对象可能是变量或方法。

Python本身以Python字典的形式维护名称空间。

在类似的行中,Python解释器可以理解代码中的确切方法或变量,这取决于名称空间。

名称可能是任何Python方法或变量,空间取决于试图访问变量或方法的位置。

命名空间的类型:

  • 内置:主要用来存放内置函数、异常等,比如:abs 函数、BaseException 异常。

  • 全局:指在模块中定义的名称,比如:类、函数等。

  • 局部:指在函数中定义的名称,比如:函数的参数、在函数中定义的变量等。

当Python解释器只在没有和用户定义的模块、方法、类等情况下运行时,在名称空间中构建(如print()、id())这些函数。当用户创建一个模块时,将创建一个全局命名空间。最后,如果你的时间不是很紧张,并且又想快速的python提高,最重要的是不怕吃苦,建议你可以架微♥信:762459510 ,那个真的很不错,很多人进步都很快,需要你不怕吃苦哦!大家可以去添加上看一下~

内置命名空间包含全局命名空间;全局命名空间包含局部命名空间.

命名空间的生存期:

命名空间的生存期取决于对象的作用域,不可能从外部命名空间访问内部命名空间的对象。

  • 内置:在 Python 解释器启动时创建,退出时销毁。

  • 全局:在模块定义被读入时创建,在 Python 解释器退出时销毁。

  • 局部:对于类,在 Python 解释器读到类定义时创建,类定义结束后销毁;对于函数,在函数被调用时创建,函数执行完成或出现未捕获的异常时销毁。

例子:

var1 is in the global namespace

var1 = 5
def some_func():

# var2 is in the local namespace 
    var2 = 6
    def some_inner_func():

# var3 is in the nested local 
        # namespace
        var3 = 7

如下图所示,相同的对象名称可以出现在多个名称空间中,因为同一名称空间之间的隔离是由名称空间维护的。

但在某些情况下,您可能只对更新或处理全局变量感兴趣,如下面的示例所示,应该将其显式标记为全局变量和更新或处理。

Python program processing

global variable

count = 5
def some_method():
    global count
    count = count + 1
    print(count)
some_method()

产出:

6

Python中的对象范围:

范围是指可从其中访问特定Python对象的编码区域。

不能从代码的任何地方访问任何特定的对象,对象的范围必须允许访问。

例1:

Python program showing

a scope of object

def some_func():
    print(“Inside some_func”)
    def some_inner_func():
        var = 10
        print(“Inside inner function, value of var:”,var)
    some_inner_func()
    print("Try printing var from outer function: ",var)
some_func()

产出:

Inside some_func
Inside inner function, value of var: 10

Traceback (most recent call last):
 File “/home/1eb47bb3eac2fa36d6bfe5d349dfcb84.py”, line 8, in
   some_func()
 File “/home/1eb47bb3eac2fa36d6bfe5d349dfcb84.py”, line 7, in some_func
   print("Try printing var from outer function: ",var)
NameError: name ‘var’ is not defined

2 作用域

2.1 概念

作用域是 Python 程序可以直接访问命名空间的文本区域(代码区域),名称的非限定引用会尝试在命名空间中查找名称,作用域是静态的。

2.2 种类

Python 有如下四种作用域:

  • 局部:最先被搜索的最内部作用域,包含局部名称。

  • 嵌套:根据嵌套层次由内向外搜索,包含非全局、非局部名称。

  • 全局:倒数第二个被搜索,包含当前模块的全局名称。

  • 内建:最后被搜索,包含内置名称的命名空间。

**作用域的搜索顺序:**从局部——嵌套——全局——内建依次进行。

Python由内向外去搜索名字 ,再通过具体代码来对作用域作进一步了解,如下所示:

全局作用域

g = 1
def outer():
   # 嵌套作用域
   e = 2
   def inner():
       # 局部作用域
       i = 3

2.3 global & nonlocal

我们先来看一下全局变量与局部变量。

  • 全局变量:定义在函数外部的变量。

  • 局部变量:定义在函数内部的变量。

全局变量可以在整个程序范围内进行访问。

而局部变量只能在函数内部访问。

通过具体示例看一下:

全局变量

d = 0
def sub(a, b):
   # d 在这为局部变量
   d = a - b
   print('函数内 : ', d)

sub(9, 1)
print('函数外 : ', d)

执行结果:

函数内 :  8
函数外 :  0

利用 global 和 nonlocal 关键字修改外部作用域的变量。将上面示例中 sub() 函数中的 d 变量修改为全局变量,则需使用 global 关键字,示例如下所示:

全局变量

d = 0
def sub(a, b):
   # 使用 global 声明 d 为全局变量
   global d
   d = a - b
   print('函数内 : ', d)

sub(9, 1)
print('函数外 : ', d)

执行结果:

函数内 :  8
函数外 :  8

如果需要修改嵌套作用域中的变量,则需用到 nonlocal 关键字。最后,如果你的时间不是很紧张,并且又想快速的python提高,最重要的是不怕吃苦,建议你可以架微♥信:762459510 ,那个真的很不错,很多人进步都很快,需要你不怕吃苦哦!大家可以去添加上看一下~

2.3.1 不使用 nonlocal

def outer():
   d = 1
   def inner():
       d = 2
       print(‘inner:’, d)
   inner()
   print(‘outer:’, d)
outer()

执行结果:

inner: 2
outer: 1

2.3.2 使用 nonlocal

def outer():
   d = 1
   def inner():
       nonlocal d
       d = 2
       print(‘inner:’, d)
   inner()
   print(‘outer:’, d)
outer()

执行结果:

inner: 2
outer: 2

以上是关于Python分享:命名空间和作用域的基础知识整合的主要内容,如果未能解决你的问题,请参考以下文章

解读Python的命名空间

PYTHON学习0031:函数---命名空间和作用域----2019-6-25

python 基础---命名空间作用域

python——作用域之LEGB规则

Python中的LEGB规则

递归函数