什么是命名空间:
命名空间是一个为 Python 中的每个对象都有唯一名称的系统。对象可能是变量或方法。Python 本身以 Python 字典的形式维护一个命名空间。让我们看一个例子,计算机中的目录文件系统结构。不用说,可以有多个目录,每个目录中都有一个同名的文件。但是,只要指定文件的绝对路径,就可以根据需要定向到该文件。
实时的例子,命名空间的作用就像一个姓氏。人们可能在班级中找不到一个“Alice”,可能有多个“Alice”,但当你特别要求“Alice Lee”或“Alice Clark”(带有姓氏)时,只会有一个(暂时不要)不要认为多个学生的名字和姓氏都相同)。
类似地,Python 解释器根据命名空间来理解尝试在代码中指向的确切方法或变量。因此,单词本身的划分提供了更多的信息。它的名称(表示名称,唯一标识符)+空间(表示与范围相关的内容)。这里,名称可以是任何 Python 方法或变量,并且空间取决于尝试访问变量或方法的位置。
命名空间的类型:
当Python解释器单独运行而没有任何用户定义的模块、方法、类等时。一些函数如print()、id()始终存在,这些是内置的命名空间。当用户创建模块时,会创建全局命名空间,稍后创建本地函数会创建本地命名空间。内置命名空间包含全局命名空间,全局命名空间包含本地命名空间。
命名空间的生命周期:
命名空间的生命周期取决于对象的范围,如果对象的范围结束,则该命名空间的生命周期也结束。因此,不可能从外部命名空间访问内部命名空间的对象。
例子:
- Python3
# var1 在全局命名空间中 var1 = 5 def some_func(): # var2 在局部命名空间中 var2 = 6 def some_inner_func(): # var3 在嵌套的局部命名空间中 var3 = 7
如下图所示,相同的对象名称可以出现在多个命名空间中,因为相同名称之间的隔离是由其命名空间维护的。
但在某些情况下,人们可能只对更新或处理全局变量感兴趣,如以下示例所示,应将其显式标记为全局变量并进行更新或处理。请注意,“count = count +1”行引用了全局变量,因此使用了全局变量,但请将其与写入“count = 1”的同一行进行比较。那么根据作用域规则,绝对需要“全局计数”行。
- Python3
# Python程序处理 # 全局变量 count = 5 # 定义全局变量count并赋值为5 def some_method(): global count # 使用global关键字声明要在函数中使用的全局变量count count = count + 1 # 增加count的值 print(count) some_method() # 调用函数some_method(),并打印count的值
这段代码定义了一个全局变量count并赋值为5。然后,定义了一个名为some_method的函数,在函数内部使用global关键字声明要在函数中使用的全局变量count,并对其进行加1操作。最后,调用函数some_method(),打印count的值。
输出:
6
Python 中对象的范围:
范围是指可访问特定 Python 对象的编码区域。因此,人们无法从代码的任何位置访问任何特定对象,访问必须得到对象范围的允许。
让我们举个例子来详细了解一下:
示例1:
- Python3
# Python程序展示 # 对象的作用域 def some_func(): print("在some_func函数内部") def some_inner_func(): var = 10 print("在内部函数中,var的值为:", var) some_inner_func() print("尝试从外部函数打印var: ", var) some_func()
这段代码定义了一个名为some_func的函数,在函数内部定义了另一个名为some_inner_func的函数。在some_inner_func内部,定义了一个局部变量var并赋值为10,然后打印了var的值。但是,在some_func函数的外部尝试打印var时,会引发NameError异常,因为var在外部函数的作用域之外不可见。
输出:
在some_func函数内部
在内部函数中,var的值为: 10
Traceback (most recent call last):
File "your_script.py", line 8, in <module>
some_func()
File "your_script.py", line 6, in some_func
print("尝试从外部函数打印var: ", var)
NameError: name 'var' is not defined
这是代码的执行输出。首先,调用some_func函数,它打印了"在some_func函数内部"。然后,在some_func内部调用了some_inner_func,它打印了"在内部函数中,var的值为: 10"。
但是,在尝试从外部函数some_func打印var时,引发了NameError异常,因为var不在外部函数的作用域内可见。所以,最后一行代码无法执行。