Как связать имя с несколькими объектами или значениями в Python

Я видел в книге об описании языка, который говорит

On the other hand, a name can be bound to no object (a dangling pointer), 
one object (the usual case), or several objects (a parameter name in a 
 recursive function).

Как мы можем связать имя с несколькими объектами? Разве это не то, что мы называем массивом, например, где все элементы имеют одинаковое имя, но с индексом? Для рекурсивной функции, как пример здесь:

x = 0
def f(y):
    global x
    x += 1
    if x < 4 :
        y +=100
        f(y)

    else: return
f(100)

Это имя y связан с несколькими значениями, которые создаются рекурсивно, так как nametable уже имеет y имя привязано к начальному значению, которое воспроизводится с помощью рекурсии?

EDITED Просто нажмите здесь визуализатор и посмотрите, что он генерирует.:)

4 ответа

Решение

Нет. Имя привязано к одному объекту. Когда мы говорим о Python - он либо привязан к одному объекту в данном контексте, либо вообще не существует.

Что происходит, так это то, что внутренняя работа может иметь имя, определенное в нескольких "слоях", но ваш код увидит только один из них.

Если имя является переменной в рекурсивной функции, вы увидите только то, что с ней связано в текущем рабочем контексте - каждый раз, когда в Python вызывается функция, фрейм выполнения, который является объектом, который содержит несколько атрибутов объекта. исполняемый код, включая ссылку на локальные переменные, заморожен. В вызываемой функции создается новый исполняемый фрейм, и там имена переменных снова привязываются к любым новым значениям, которые они имеют в вызываемом контексте. Ваш код просто "видит" этот экземпляр.

Затем возникает проблема глобальных переменных и встроенных объектов в Python: если имя не является локальной переменной в контексте выполнения функции, оно ищется в глобальных переменных для модуля (опять же, будет видна только одна из них) И если в глобальных именах имя не указано, Python ищет его в globals().__builtins__ это ваш последний звонок.

Если я вас правильно понимаю, вы спрашиваете, какие правила есть у Python для создания переменных в разных областях. Python использует лексическую область видимости на уровне функций.

Трудно точно сказать, что вы получаете с написанным вами кодом, но, хотя может быть и другое значение, связанное с y в разных областях (со значением y определенный на каждом уровне рекурсии), ваш код сможет видеть только один за раз (значение, определенное в области, в которой вы работаете).

Чтобы по-настоящему понять правила видимости в Python, я бы взглянул на PEP 227. Также взгляните на этот вопрос переполнения стека.

Наконец, чтобы иметь возможность разумно говорить о том, что такое "имя" в Python, я предлагаю вам прочитать о том, как Python является " Call-By-Object" языком.

На данный момент мы способны понять, что вместо "именного" python использует словарь для хранения того, что доступно в данной области видимости. Смотрите этот ответ для более подробной информации. Следствием этого является то, что вы никогда не можете иметь два одинаковых имени в одной области видимости (по той же причине вы не можете иметь два одинаковых ключа в словаре Python). Так что пока y может существовать в словаре для другой области, у вас нет возможности получить к нему доступ, так как вы можете получить доступ только к переменным в словаре текущей области.

Ключ:

несколько объектов (имя параметра в рекурсивной функции).

Этот отрывок почти наверняка относится не к массивам, а просто к тому факту, что в рекурсивной функции (или любой функции, но рекурсивной функции, скорее всего, одновременно будет несколько активаций), параметр может быть связан с другим значением в каждый рекурсивный вызов.

Это не означает, что вы можете получить доступ к каждому такому объекту в каждом кадре стека; на самом деле смысл техники заключается в том, чтобы гарантировать, что в каждом кадре стека доступно только одно такое значение.

Во-первых, вы должны упомянуть в вопросе, что предложение из книги не связано явно с Python (как писал jsbueno, одно имя связано точно с одним объектом в Python).

В любом случае, имя, привязанное к какому-либо объекту, немного неточно. Как правило, имена связаны с переменными, а имя, связанное с висящим указателем, является именем этой переменной указателя.

Говоря о области видимости переменной (то есть части кода, где используется переменная), одно имя переменной может использоваться только для одного значения за раз. Однако могут существовать другие части кода, независимо от того, где мы думаем об этой переменной. В другой части кода может использоваться то же имя; однако две переменные с одинаковым именем полностью изолированы. Это случай локальных переменных также и в случае тел функций. Если язык допускает рекурсию, он должен иметь возможность создавать другое изолированное пространство локальной переменной даже для другого вызова той же функции.

В Python каждая функция может также обращаться к внешним переменным, но более обычно использовать внутренние локальные переменные. Когда бы вы ни присвоили имени какое-либо значение, оно создается в локальном пространстве.

Другие вопросы по тегам