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

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

    while exit == 0:
       option = (raw_input("What would you like to do? "))
       if option == exit:
          exit()
    def exit():
       exit = 1

Это всего лишь пример того, что я пытаюсь сделать.

Когда я пытаюсь запустить его, он не выходит из цикла while и при этом не завершает программу.Как я могу сделать так, чтобы цикл while распознавал, что выход равен 1, и покидает цикл?Извините, если вопрос не очень хороший, потому что я впервые использую stackoverflow, чтобы задать вопрос.

ДОПОЛНЕНИЕ: я хочу знать, как изменить переменную в функциях, потому что я буду делать это по частямпрограмма.Кроме того, я собираюсь сохранить данные перед выходом, поэтому у меня есть «выход» в другой функции

Ответы [ 6 ]

3 голосов
/ 29 февраля 2012

Ваша проблема здесь в области видимости - exit является локальной для функции exit(), поэтому не влияет на переменную exit в области видимости цикла.

Лучшее решение это:

exit = False
while not exit:
    option = raw_input("What would you like to do?")
    if option == "exit":
        exit = True

Или просто:

while True:
    option = raw_input("What would you like to do?")
    if option == "exit":
        break

Обратите внимание на использование True и False над 1 и 0 - это более питоническое значение, поскольку здесь вы подразумеваете истинные значения, а не целые числа. Я также изменил сравнение со строкой "exit", поскольку предположил, что это именно то, что вам нужно, не сравнивая введенные пользователем значения со значением exit.

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

class Doer: #Naturally, give it a real name based on it's purpose.
    def __init__(self):
        self.exit = False
        while not self.exit:
            option = raw_input("What would you like to do?")
            if option == "exit":
                self.exit()

    def exit(self):
        self.exit = True

Здесь exit - переменная экземпляра (следовательно, к ней обращаются из self), и поэтому оба раза мы ссылаемся на одну и ту же переменную.

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

1 голос
/ 29 февраля 2012

Простой способ изменить переменные из другой функции - вернуть значение и затем присвоить его локально. В вашем примере кода это выглядит так:

while exit == 0:
   option = (raw_input("What would you like to do? "))
   if option == 'exit':
      exit = set_exit()

def set_exit():
   return 1
1 голос
/ 29 февраля 2012

Такая переменная выглядит как состояние некоторого объекта.Чтобы этот объект служил функцией, вы можете сделать его вызываемым

class Ask(object):
    def __call__(self):
        self.exit = False
        while not self.exit:
            option = (raw_input("What would you like to do? "))
            if option == 'exit':
                break
    def quit():
        self.exit = True

ask  = Ask()

>>> ask()
1 голос
/ 29 февраля 2012

сначала ваша переменная и функция не должны иметь одно и то же имя, но вот что может вам подойти:

status = True
while status:
   option = (raw_input("What would you like to do? "))
   if option == "exit":
      break
   elif option == "do_something":
      status = do_something()
   elif option == "do_something_and_exit":
      status = do_something_and_exit()
   else:
      print "I don't understand"

def do_something():
    #do something awesome
    return True
def do_something():
    #do someting awesome
    return False
1 голос
/ 29 февраля 2012

Просто используйте break вместо вашего exit вызова и выбросьте вашу exit функцию.

0 голосов
/ 29 февраля 2012

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

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

x = 1

def mutateX(new):
    nonlocal x     # you will have to use the 'global' keyword if this function is defined in the body of a module
    x = new

print(x)  # --> 1
mutateX(2)
print(x)  # --> 2

Это не то, что вы должны делать в этом случае (просто используйте break), но оно отвечает на вопрос, который выспросил в заголовке вашего вопроса.

...