如何在一个函数中定义一个变量,并在第一个函数识别它的情况下在另一个函数中更改它

时间:2012-02-28 22:40:37

标签: python function while-loop

我如何创建一个函数,其中一个变量(退出)确定'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提问。

附加:我想知道如何在函数之间更改变量,因为我将在程序的某些部分执行此操作。另外,我将在退出之前保存数据,这就是为什么我在另一个函数中使用'exit'

6 个答案:

答案 0 :(得分:3)

此处的问题是范围 - 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

请注意TrueFalse相对于10的使用 - 这更像是pythonic,因为这里你的意思是真值,而不是整数。我也改为与字符串"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 :(得分:1)

只需使用break代替exit来电,即可将exit功能抛弃。

答案 2 :(得分:1)

首先你的变量和函数不应该有相同的名称,但这里有一些可能对你有用的东西:

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

答案 3 :(得分:1)

这样的变量看起来像某个对象的状态。要使此对象充当函数,您可以使其可调用

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()

答案 4 :(得分:1)

从另一个函数更改变量的简单方法是返回该值,然后在本地分配它。在您的代码示例中,它看起来像这样:

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

def set_exit():
   return 1

答案 5 :(得分:0)

似乎我对答案方来说有点晚了,但是这里是如何使用闭包和变异(以及古老的编程技巧)来做到这一点。

这将在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),但它会回答你在问题标题中提出的问题。