Python命名空间– Python变量范围
在本教程中,我们将学习Python命名空间和变量作用域。
在上一教程中,我们了解了Python自定义异常。
Python命名空间
命名空间是一种命名系统,可以避免歧义并使名称唯一。
如果您熟悉其他编程语言(例如C/C++/Java),则可能已经知道名称空间。
但是,Python的名称空间是使用Python字典实现的。
这意味着名称空间基本上是一个键值对。
对于给定的键,将有一个值。
在以下各节中,我们将讨论名称及其空间。
名称及其空间
如果剖析名称空间一词,将会得到两件事。
一个是名字,另一个是空间。
名称基本上是指对象名称(也称为标识符)。
这意味着,您声明的对象是扩大名称空间。
前面我们已经说过,python中的名称空间是使用字典实现的。
因此考虑一下,有两个名称空间,即nameA和nameB。
你可以想象他们是
nameA={ ‘var_name1’=object1, ‘var_name2’=object2, …} nameB={ ‘var_name1’=object3, ‘var_name2’=object5, ‘var_name3’=object6, …}
其中您可以看到,两个名称空间中的名称可以相同,但作为对象它们是不同的。
因此,名称空间允许我们在不同名称空间中使用相同名称的对象。
以下代码将为您提供名称空间的基本概念。
name = 'Andy' # define name def printBob(): name = 'Bob' # define name in function print('printing from the def: ', name) # print from function # the main function print('printing from the main: ', name) # print from the main printBob() # call the function to print
产生的输出将是
printing from the main: Andy printing from the def: Bob
因此,您可以看到两个不同的对象具有相同的名称,但是它们在不同的范围内。
因此,它们的输出不同。
Python变量范围
实际上,范围是指可以从中访问该范围的对象的编码区域。
这意味着,您无法从代码的任何位置访问特定功能的对象。
像下面的代码一样,您将看到无法从其范围之外访问对象。
def printBob(): var = 'print it' print('printing from the function: ', var) # this will print # call the function to print the variable value printBob() # try to access the object from outside of its scope print('printing from the main: ', var) # this will produce error
也就是说,您可以从主作用域调用该函数,但是不能从主作用域访问该函数的对象。
因此,这里涉及范围的概念。
基本上,您可以将一个缩进块视为其范围。
这意味着,在下面的代码中;
var = 0 name = 'absicsa' def function_outer(): # global var ; no need to declare to call the value name = 'nabisco' def function_inner(): global var # need to declare global to modify the value name = 'outlet' var = 23 print('name :',name, ', var :', var) print('name :', name, ', var :', var) function_inner() print('name :', name, ', var :', var) function_outer()
其中您可以看到,相同的缩进块由相同的名称空间组成。
因此,可以从主函数的作用域调用function_outer()函数,而可以从function_outer()函数的作用域调用function_inner()函数。
您还可以看到可以从内部名称空间访问全局变量。
命名空间的生命周期
命名空间的生存期有所不同,因为它们是在不同的时间创建的。
当作用域结束时,通常会删除在该作用域中创建的对象。
因此,您无法从外部名称空间访问提供内部名称空间的对象,因为它们尚未创建或者名称空间已被删除。
但是在前面的示例中,您看到可以从内部名称空间的外部名称空间访问对象。