Какой лучший способ изменить переменную, используя функцию, но внутри другой функции? - PullRequest
1 голос
/ 11 марта 2019

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

def insideAFunction():
    variableToMod =  "test"

    def modFunc():
        if 1 > 0:
            variableToMod = "TEST"

    print("before: " + variableToMod)
    modFunc()
    print("after: " + variableToMod)


def insideAFunction2():
    variableToMod =  "test"

    def modFunc():
        global variableToMod
        if 1 > 0:
            variableToMod = "TEST"

    print("before: " + variableToMod)
    modFunc()
    print("after: " + variableToMod)

insideAFunction()
insideAFunction2()

Выход:

before: test
after: test
before: test
after: test

Желаемый результат будет:

after: TEST

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

Ответы [ 3 ]

1 голос
/ 11 марта 2019
  1. Вы изменяете значение variableToMod в modFunc, но не возвращаете его.
  2. Второй оператор print variableToMod все еще печатает, но принимает переменную variableToMod, объявленную в строке 2

Так что он всегда будет печатать одинаково. Вам нужно вернуть значение из modFunc и присвоить его внешней переменной ToMod перед печатью. Таким образом, результат будет

до: тест после: ТЕСТ

def insideAFunction2 (): variableToMod = "test"

def modFunc():
    if 1 > 0:
        variableToMod = "TEST"
        return variableToMod


print("before: " + variableToMod)
variableToMod = modFunc()
print("after: " + variableToMod)
0 голосов
/ 11 марта 2019

Использование функции возврата отлично работает на мне:

def insideAFunction():
    variableToMod =  "test"

    def modFunc():
        if 1>0:
            variableToMod = "TEST"
            return variableToMod

    print("before: " + variableToMod)
    variableToMod = modFunc()
    print("after: " + variableToMod)

insideAFunction()

вывод:

before: test
after: TEST
0 голосов
/ 11 марта 2019

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

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

EDIT: На самом деле, Python 2.x имеет такое же поведение, но, похоже, не поддерживает оператор nonlocal.Я думаю, что одним из решений может быть передача в словарь local () и изменение записей в нем внутри вашей внутренней функции, но я не уверен, что это сработает.Я должен был попробовать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...