English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Python 基础教程

Python 流程控制

Функции в Python

Типы данных Python

Python 文件操作

Python 对象和类

Python 日期和时间

Python 高级知识

Python 参考手册

Наместное пространство и область видимости в Python

在本文中,您将了解命名空间,从名称到对象的映射以及变量的作用域。

Python中的命名空间是什么?

如果您曾经读过“ 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

Что произошло в этой последовательности шагов? Давайте объясним это с помощью схемы:

Граф памяти переменных в Python

Вначале создается объект 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 вы можете представить пространство имён как карту, где каждый определенный имя связано с соответствующим объектом.

Различные пространства имён могут существовать одновременно, но они полностью изолированы друг от друга.

Когда мы запускаем интерпретатор Python, создается пространство имён, содержащее все内置ые имена, и оно существует до тех пор, пока интерпретатор работает.

Вот почему встроенные функции (например, id()) и print() всегда можно использовать из любого участка программы. КаждыйМодульСоздайте свою собственную глобальную область имён.

Эти различные пространства имён изолированы. Поэтому имена, существующие в различных модулях, не будут конфликтовать.

Модуль может иметь различные функции и классы. При вызове функции создается локальное пространство имён, в котором определены все имена. Как и в классах. Ниже приведена схема, которая может помочь объяснить этот концепт.

Схема различных пространств имён в Python

Область видимости переменных в Python

Несмотря на то, что были определены различные уникальные пространства имён, мы можем не иметь доступа к ним из каждого участка программы. Начинает действовать концепция области видимости.

Область видимости является частью программы, из которой可以直接 обращаться к命名ному пространству без любого префикса.

В каждый момент времени, по крайней мере, три вложенные области видимости.

  1. Область видимости текущей функции с локальными именами

  2. Область видимости модуля с глобальными именами

  3. Наибольшая область видимости с внутренними именами

При указании на имя внутри функции, сначала будет производиться поиск в локальном命名ном пространстве, затем в глобальном命名ном пространстве, и, наконец, в встроенном命名ном пространстве.

Если в одной функции есть другая функция, то новый контекст вложен в локальный контекст.

Пример действия области видимости и命名ного пространства Python

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.