нелокальное ключевое слово в Python 2.x

Я пытаюсь реализовать закрытие в Python 2.6, и я должен получить доступ к нелокальной переменной, но кажется, что это ключевое слово не доступно в Python 2.x. Как должен один доступ нелокальные переменные в закрытиях в этих версиях Python?

112
задан Niels Bom 1 July 2013 в 13:39
поделиться

2 ответа

Внутренние функции могут читать нелокальные переменные в 2.x, только не перепривязывать их. Это раздражает, но это можно обойти. Просто создайте словарь и храните данные как элементы в нем. Внутренним функциям не запрещено изменять объекты, на которые ссылаются нелокальные переменные.

Используя пример из Википедии:

def outer():
    d = {'y' : 0}
    def inner():
        d['y'] += 1
        return d['y']
    return inner

f = outer()
print(f(), f(), f()) #prints 1 2 3
118
ответ дан 24 November 2019 в 02:50
поделиться

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

x = 3
def outer():
    def inner():
        print x
    inner()
outer()

должен работать должным образом (печать 3). Однако переопределение значения x не работает, например,

x = 3
def outer():
    def inner():
        x = 5
    inner()
outer()
print x

по-прежнему будет печатать 3. Насколько я понимаю PEP-3104 , это то, что предназначено для ключевого слова nonlocal. Как упоминалось в PEP, вы можете использовать класс для выполнения того же самого (вроде беспорядка):

class Namespace(object): pass
ns = Namespace()
ns.x = 3
def outer():
    def inner():
        ns.x = 5
    inner()
outer()
print ns.x
14
ответ дан 24 November 2019 в 02:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: