Доступ к переменной из вдвойне вложенной функции в Python

Следующий код:

x = 0
print "Initialization: ", x
def f1():
    x = 1
    print "In f1 before f2:", x
    def f2():
        global x
        x = 2
        print "In f2:          ", x
    f2()
    print "In f1 after f2: ", x
f1()
print "Final:          ", x

печать:

Initialization:  0
In f1 before f2: 1
In f2:           2
In f1 after f2:  1
Final:           2

Есть ли путь к f2 к доступу f1переменные?

5
задан kzh 18 February 2010 в 17:18
поделиться

3 ответа

Вы можете получить доступ к переменным, проблема в присвоении. В Python 2 нет способа перепривязать x к новому значению. Подробнее об этом смотрите PEP 227 (вложенные диапазоны).

В Python 3 вы можете использовать новое ключевое слово nonlocal вместо global. См. PEP 3104.

6
ответ дан 13 December 2019 в 05:34
поделиться

В Python 3 вы можете определить x как нелокальный в f2.

В Python 2 вы не можете напрямую присвоить x из f1 в f2. Однако вы можете прочитать его значение и получить доступ к его членам. Поэтому это может быть обходным решением:

def f1():
    x = [1]
    def f2():
        x[0] = 2
    f2()
    print x[0]
f1()
6
ответ дан 13 December 2019 в 05:34
поделиться

Visual Studio определяет _ DEBUG при указании параметра /MTd или /MDd , NDEBUG отключает утверждения стандарта C. Используйте их при необходимости, т.е. _ DEBUG , если вы хотите, чтобы ваш отладочный код соответствовал методам отладки MS CRT и NDEBUG , если вы хотите быть совместимым с assert () .

Если вы определяете собственные отладочные макросы (и не взламываете компилятор или среду выполнения C), избегайте запуска имен с подчеркиванием, поскольку они зарезервированы.

-121--2509259-

Возможно, класс ASP.NET Cache (System.Web.Caching.Caching.Cache) поможет достичь желаемого? Он автоматически удаляет объекты, если объем памяти уменьшается:

Вот статья, в которой показано, как использовать класс Cache в приложении форм Windows.

в кавычках из: Эквивалент SoftReference в .net?

-121--2304657-

удалить глобальную инструкцию

>>> x
0
>>> def f1():
    x = 1
    print(x)
    def f2():
        print(x)
    f2()
    print(x)


>>> f1()
1
1
1

, если требуется изменить переменную x с f1 , то в каждой функции необходимо использовать глобальную инструкцию.

0
ответ дан 13 December 2019 в 05:34
поделиться
Другие вопросы по тегам:

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