English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
在本文中,您将了解命名空间,从名称到对象的映射以及变量的作用域。
如果您曾经读过“ Python之禅(The Zen of Python) ”(在Python解释器中输入import this),最后一行指出,命名空间是一个很棒的主意-让我们做更多的事情!那么这些神秘的命名空间是什么?首先让我们看看名称是什么。
名称(也称为标识符)只是赋予对象的名称。Python中的一切都是对象。名称是访问基础对象的一种方式。
例如,当我们执行赋值操作时a = 2,2是一个存储在内存中的对象,而a是与之名相关联的名称。我们可以通过内置函数 获取某些对象的地址(在RAM中)id()。让我们看看如何使用它。
# 注意: 您可能会得到不同的id值 a = 2 print('id(2) =', id(2)) print('id(a) =', id(a))
Результат вывода
id(2) = 9302208 id(a) = 9302208
在这里,两者都引用相同的对象2,因此它们具有相同的id()。让我们做些有趣的事情。
# 注意: 您可能会得到不同的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
Что произошло в этой последовательности шагов? Давайте объясним это с помощью схемы:
Вначале создается объект 2 и связывается с именем a, когда мы выполняем a = a + 1, создается новый объект 3, и теперь a связывается с этим объектом.
Обратите внимание, что id(a) и id(3) имеют одинаковые значения.
Кроме того, когда мы выполняем b = 2, новый имен b связывается с предыдущим объектом 2.
Это эффективно, потому что Python не обязан создавать новые повторяющиеся объекты. Эта динамическая характеристика связывания имён делает Python мощным. Имена могут ссылаться на объекты любого типа.
>>> a = 5 >>> a = 'Hello World!' >>> a = [1, 2, 3]
Все это эффективно иaБудут ссылаться на три различных типа объектов в различных примерах.ФункцияЭто также объекты, поэтому имена могут ссылаться на них.
def printHello(): print("Hello") a = printHello a()
Результат вывода
Hello
Одно и то же имяaМы можем ссылаться на функцию и использовать это имя для вызова функции.
Теперь, когда мы знаем, что такое имена, мы можем продолжить с концепцией пространства имён.
Короче говоря, пространство имён - это набор имён.
В Python вы можете представить пространство имён как карту, где каждый определенный имя связано с соответствующим объектом.
Различные пространства имён могут существовать одновременно, но они полностью изолированы друг от друга.
Когда мы запускаем интерпретатор Python, создается пространство имён, содержащее все内置ые имена, и оно существует до тех пор, пока интерпретатор работает.
Вот почему встроенные функции (например, id()) и print() всегда можно использовать из любого участка программы. КаждыйМодульСоздайте свою собственную глобальную область имён.
Эти различные пространства имён изолированы. Поэтому имена, существующие в различных модулях, не будут конфликтовать.
Модуль может иметь различные функции и классы. При вызове функции создается локальное пространство имён, в котором определены все имена. Как и в классах. Ниже приведена схема, которая может помочь объяснить этот концепт.
Несмотря на то, что были определены различные уникальные пространства имён, мы можем не иметь доступа к ним из каждого участка программы. Начинает действовать концепция области видимости.
Область видимости является частью программы, из которой可以直接 обращаться к命名ному пространству без любого префикса.
В каждый момент времени, по крайней мере, три вложенные области видимости.
Область видимости текущей функции с локальными именами
Область видимости модуля с глобальными именами
Наибольшая область видимости с внутренними именами
При указании на имя внутри функции, сначала будет производиться поиск в локальном命名ном пространстве, затем в глобальном命名ном пространстве, и, наконец, в встроенном命名ном пространстве.
Если в одной функции есть другая функция, то новый контекст вложен в локальный контекст.
def outer_function(): b = 20 def inner_func(): c = 30 a = 10
Здесь переменнаяaв глобальном命名ном пространстве. Переменнаяbв локальном命名ном пространстве outer_function(), аcв внутреннем локальном命名ном пространстве inner_function().
когда мы в inner_function()cв нашем локальномbв неглобальномaв глобальном. Мы можем дляcчитать и присваивать новые значения, но только изbиainner_function().
Если мы пытаемся присвоить в качестве значенияb, новый переменнойbв локальном命名ном пространстве создается по-другому, чем в неглобальномb. Когда мы присваиваем значение, происходит то же самоеодин.
Но если мы我们将aявляется глобальной a, то все ссылки и назначения будут перемещены в глобальноеaЕсли мы хотим перебinder переменнуюbЕсли переменную необходимо объявить как нелокальную, то это необходимо сделать. Примеры将进一步 иллюстрировать это.
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)
Как вы видите, вывод программы составляет
a = 30 a = 20 a = 10
В этой программе определены три различных переменные в различных命名ных пространствахaи провели соответствующий доступ. В следующей программе:
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)
Вывод программы.
a = 30 a = 30 a = 30
Здесь, из-за использования ключевого слова global, все ссылки и назначения указывают на глобальную переменную a.