Python命名空间– Python变量范围

时间:2020-02-23 14:43:04  来源:igfitidea点击:

在本教程中,我们将学习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()函数。
您还可以看到可以从内部名称空间访问全局变量。

命名空间的生命周期

命名空间的生存期有所不同,因为它们是在不同的时间创建的。
当作用域结束时,通常会删除在该作用域中创建的对象。
因此,您无法从外部名称空间访问提供内部名称空间的对象,因为它们尚未创建或者名称空间已被删除。
但是在前面的示例中,您看到可以从内部名称空间的外部名称空间访问对象。