Python中的名称是什么?

如果您曾经阅读过“Python 之禅”(import this在 Python 解释器中输入),那么最后一行指出,命名空间是一个很棒的想法——让我们做更多这样的事情!那么这些神秘的命名空间是什么呢?让我们先看看什么是名字。
名称(也称为标识符)只是对象的名称。Python 中的一切都是对象。名称是访问底层对象的一种方式。
例如,当我们进行赋值时a = 2,2是一个存储在内存中的对象和一种是我们与之关联的名称。我们可以通过内置函数 获取某个对象的地址(在 RAM 中)id()。让我们来看看如何使用它。

Note: You may get different values for the id a = 2 print(‘id(2) =’, id(2)) print(‘id(a) =’, id(a))
输出
id(2) = 9302208 id(a) = 9302208
在这里,两者都引用同一个 object 2,因此它们具有相同的id(). 让我们让事情变得更有趣。
# Note: You may get different values for the id a = 2 print(‘id(a) =’, id(a)) a = a+1 print(‘id(a) =’, id(a)) print(‘id(3) =’, id(3)) b = 2 print(‘id(b) =’, id(b)) print(‘id(2) =’, id(2))
输出
id(a) = 9302208 id(a) = 9302240 id(3) = 9302240 id(b) = 9302208 id(2) = 9302208
上述步骤序列中发生了什么?让我们用一张图来解释这一点:
image.png
Python中变量的内存图
最初,2创建一个对象并命名一种与它相关联,当我们这样做时a = a+1,3会创建一个新对象,现在一种 与此对象相关联。
请注意,id(a)和id(3)具有相同的值。
此外,当b = 2执行时,新名称乙与前一个对象相关联2。
这是有效的,因为 Python 不必创建新的重复对象。名称绑定的这种动态特性使 Python 功能强大;名称可以指代任何类型的对象。
>>> a = 5 >>> a = ‘Hello World!’ >>> a = [1,2,3]

所有这些都是有效的和 一种将在不同的实例中引用三种不同类型的对象。函数也是对象,因此名称也可以引用它们。
def printHello(): print(“Hello”) a = printHello a()
输出
你好
同名 一种 可以引用一个函数,我们可以使用这个名称调用该函数。


Python 中的命名空间是什么?

现在我们了解了名称是什么,我们可以继续讨论名称空间的概念。
简单地说,命名空间是名称的集合。
在 Python 中,您可以将命名空间想象为您定义的每个名称到相应对象的映射。
不同的命名空间可以在给定时间共存,但完全隔离。
当我们启动 Python 解释器时会创建一个包含所有内置名称的命名空间,并且只要解释器运行就存在。
这是一个内置的功能一样的原因id(),print()等总是提供给我们从程序的任何部分。每个模块创建自己的全局命名空间。
这些不同的命名空间是相互隔离的。因此,可能存在于不同模块中的相同名称不会发生冲突。
模块可以有各种功能和类。调用函数时会创建本地命名空间,其中定义了所有名称。类的情况类似。下图可能有助于澄清这个概念。
image.png
Python 中不同命名空间的示意图


Python 变量范围

尽管定义了各种独特的命名空间,但我们可能无法从程序的每个部分访问所有这些命名空间。范围的概念开始发挥作用。
作用域是程序中可以直接访问命名空间而无需任何前缀的部分。
在任何给定时刻,至少有三个嵌套作用域。

  1. 具有本地名称的当前函数的范围
  2. 具有全局名称的模块的范围
  3. 具有内置名称的最外层作用域

当在函数内部进行引用时,名称会在本地命名空间中搜索,然后在全局命名空间中搜索,最后在内置命名空间中搜索。
如果在另一个函数中存在一个函数,则在局部作用域内嵌套一个新的作用域。


Python 中的作用域和命名空间示例

def outer_function(): b = 20 def inner_func(): c = 30 a = 10
这里,变量 一种位于全局命名空间中。多变的乙是的本地命名空间outer_function()和C位于 的嵌套本地命名空间中inner_function()。
当我们在inner_function(),C 对我们来说是本地的, 乙 是非本地的并且 一种是全球性的。我们可以读取以及分配新值C 但只能阅读 乙 和 一种 从inner_function().
如果我们尝试赋值给 乙, 一个新变量 乙 在不同于非本地的本地命名空间中创建 乙. 当我们给一个值赋值时会发生同样的事情一种.
但是,如果我们声明 一种 作为全局,所有的引用和赋值都去全局 一种. 同样,如果我们想重新绑定变量乙,它必须声明为非本地的。下面的例子将进一步阐明这一点。
def outer_function(): a = 20 def inner_function(): a = 30 print(‘a =’, a) inner_function() print(‘a =’, a) a = 10 outer_function() print(‘a =’, a)
如您所见,该程序的输出是
一 = 30 一 = 20 一 = 10
在这个程序中,三个不同的变量 一种在单独的命名空间中定义并相应地访问。在下面的程序中,
def outer_function(): global a a = 20 def inner_function(): global a a = 30 print(‘a =’, a) inner_function() print(‘a =’, a) a = 10 outer_function() print(‘a =’, a)
程序的输出是。
一 = 30 一 = 30 一 = 30
在这里,所有引用和赋值都指向全局 一种由于使用了关键字global。

  1. 下一个教程:[Python 流控制 if...else](https://www.yuque.com/aifanj/odpp1n/xmgg9a)